Math.random () คำอธิบาย


133

นี่เป็นคำถาม Java ที่ค่อนข้างเรียบง่าย (แม้ว่าอาจใช้ได้กับการเขียนโปรแกรมทั้งหมด):

Math.random() ส่งกลับตัวเลขระหว่างศูนย์ถึงหนึ่ง

ถ้าฉันต้องการส่งคืนจำนวนเต็มระหว่างศูนย์ถึงร้อยฉันจะทำ:

(int) Math.floor(Math.random() * 101)

ระหว่างหนึ่งถึงร้อยฉันจะทำ:

(int) Math.ceil(Math.random() * 100)

แต่ถ้าฉันอยากได้ตัวเลขระหว่างสามถึงห้าล่ะ? จะเป็นเหมือนข้อความต่อไปนี้หรือไม่:

(int) Math.random() * 5 + 3

ฉันรู้เกี่ยวกับnextInt()ในjava.lang.util.Random. แต่ฉันต้องการเรียนรู้วิธีการทำกับMath.random().


สำหรับ [3,5]:(int)Math.floor(Math.random()*3) + 3
good_evening

9
BTW: ช่วงตั้งแต่ 0.0 รวมถึง 1.0 พิเศษ (คุณจะไม่ได้รับ 1.0 เลย) การใช้ nextInt () เป็นทางเลือกที่ดีกว่ามากไม่เพียง แต่จะง่ายกว่า แต่ยังเร็วกว่ามากด้วย
Peter Lawrey

2
ใช้Math.ceilไม่ถูกต้องก็ให้ผลไม่ถูกต้องเมื่อผลตอบแทนMath.random() 0
starblue

จะเกิดอะไรขึ้นถ้า Math.floor ส่งกลับ 0.029 จะรับตัวเลขสองหลักด้วยคำสั่งเดียวได้อย่างไร?
Naisheel Verdhan

คำตอบ:


165
int randomWithRange(int min, int max)
{
   int range = (max - min) + 1;     
   return (int)(Math.random() * range) + min;
}

ผลลัพธ์randomWithRange(2, 5)10 เท่า:

5
2
3
3
2
4
4
4
5
4

ขอบเขตรวมอยู่ด้วยเช่น [2,5] และminต้องน้อยกว่าmaxในตัวอย่างข้างต้น

แก้ไข:หากมีคนพยายามทำตัวงี่เง่าและย้อนกลับminและmaxคุณสามารถเปลี่ยนรหัสเป็น:

int randomWithRange(int min, int max)
{
   int range = Math.abs(max - min) + 1;     
   return (int)(Math.random() * range) + (min <= max ? min : max);
}

แก้ไข 2:สำหรับคำถามของคุณเกี่ยวกับdoubles มันเป็นเพียง:

double randomWithRange(double min, double max)
{
   double range = (max - min);     
   return (Math.random() * range) + min;
}

และอีกครั้งหากคุณต้องการพิสูจน์ความงี่เง่ามันเป็นเพียง:

double randomWithRange(double min, double max)
{
   double range = Math.abs(max - min);     
   return (Math.random() * range) + (min <= max ? min : max);
}

1
จะเกิดอะไรขึ้นถ้าคุณไม่ได้ใช้(int)และต้องการส่งคืน a double?
switz

หากคุณต้องการเพิ่มเป็นสองเท่าให้แทนที่ints ด้วยdoubles (และไม่จำเป็นต้องพิมพ์ตัวพิมพ์) ฉันคิดว่าคุณต้องการintแต่ฉันจะเพิ่มในโพสต์ของฉัน
AusCBloke

2
จริงๆแล้วด้วยdoubles ลบ+ 1ด้วยเนื่องจากMath.random()ไม่ได้ถูกตัดทอน อย่างไรก็ตามช่วงจะเป็น [min, max) เนื่องจากMath.random"ส่งกลับค่าสองค่าที่มีเครื่องหมายบวกมากกว่าหรือเท่ากับ 0.0 และน้อยกว่า 1.0" จะมีโอกาสน้อยมากที่ตัวเลขจะเป็นmaxอยู่ดีแม้ว่าจะเป็นไปได้ก็ตาม
AusCBloke

44

หากคุณต้องการสร้างตัวเลขตั้งแต่ 0 ถึง 100 รหัสของคุณจะมีลักษณะดังนี้:

(int)(Math.random() * 101);

ในการสร้างตัวเลขจาก 10 ถึง 20:

(int)(Math.random() * 11 + 10);

ในกรณีทั่วไป:

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);

(โดยlowerboundรวมและเป็นupperboundเอกสิทธิ์เฉพาะบุคคล)

การรวมหรือการยกเว้นupperboundขึ้นอยู่กับตัวเลือกของคุณ สมมติว่าrange = (upperbound - lowerbound) + 1แล้วupperboundรวม แต่ถ้าrange = (upperbound - lowerbound)นั้นupperboundเป็นพิเศษ

ตัวอย่าง: หากฉันต้องการจำนวนเต็มระหว่าง 3-5 ดังนั้นหากช่วงเป็น (5-3) +1 แล้วจึงรวม 5 แต่ถ้าช่วงเป็นเพียง (5-3) ดังนั้น 5 จะเป็นค่าเฉพาะ


2
upperboundเอกสิทธิ์? ฉันคิดว่ามันจะรวม
vidit

1
@vidit เป็นเอกสิทธิ์

1
อย่าคิดว่าคุณจะได้รับภาพใหญ่ ๆ จาก Upperbound ดังที่ให้ไว้ในตัวอย่าง
Teezy7

19

Randomชั้นเรียนของ Java อยู่ในjava.utilแพคเกจที่จะตอบสนองวัตถุประสงค์ของคุณดีขึ้น มีnextInt()วิธีการบางอย่างที่ส่งคืนจำนวนเต็ม ตัวที่รับอาร์กิวเมนต์ int จะสร้างตัวเลขระหว่าง 0 และ int นั้นซึ่งไม่รวมตัวหลัง


Math.random()ฉันปรับปรุงคำถามของฉันฉันต้องการที่จะรู้วิธีที่จะทำมันด้วย ขอบคุณ.
switz

1

ในการสร้างตัวเลขระหว่าง 10 ถึง 20 คุณสามารถใช้ java.util.Random

int myNumber = new Random().nextInt(11) + 10

0

นี่คือวิธีการรับขอบเขตและส่งกลับจำนวนเต็มแบบสุ่ม เป็นขั้นสูงกว่าเล็กน้อย (เป็นสากลอย่างสมบูรณ์): ขอบเขตสามารถเป็นได้ทั้งบวกและลบและขอบเขตต่ำสุด / สูงสุดสามารถเรียงลำดับได้

int myRand(int i_from, int i_to) {
  return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
}

โดยทั่วไปจะหาระยะห่างสัมบูรณ์ระหว่างเส้นขอบรับค่าสุ่มที่เกี่ยวข้องจากนั้นเลื่อนคำตอบตามเส้นขอบด้านล่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.