สร้างตัวเลขสุ่มระหว่างสองตัวเลขใน JavaScript


1796

มีวิธีในการสร้างตัวเลขสุ่มในช่วงที่ระบุ (เช่นจาก 1 ถึง 6: 1, 2, 3, 4, 5 หรือ 6) ใน JavaScript หรือไม่


12
Math.floor (Math.random () * 7)
Amjad Masad

65
แน่นอน .. Math.floor (Math.random () * 6 + 1)
Amjad Masad

3
นาบิลคาดิมิเขียนบทความเกี่ยวกับวิธีสร้างตัวเลขสุ่มเชิงลบด้วย
madc

นี่คือส่วนสำคัญที่มีประโยชน์: gist.github.com/kerimdzhanov/7529623
Dan KK

เหตุใดโซลูชันเช่นนี้Math.floor((Math.random()*10)+1);จึงไม่สามารถทำงานให้คุณได้ตามที่ระบุไว้ที่w3schools.com/jsref/jsref_random.asp ..
shashwat

คำตอบ:


2115

สิ่งสำคัญ

1รหัสต่อไปนี้จะทำงานเฉพาะถ้าค่าต่ำสุดคือ มันไม่ทำงานสำหรับค่าต่ำสุดที่นอกเหนือ1จาก

หากคุณต้องการรับจำนวนเต็มแบบสุ่มระหว่าง 1 ( และ 1 เท่านั้น ) และ 6 คุณจะคำนวณ:

Math.floor(Math.random() * 6) + 1  

ที่ไหน:

  • 1 คือหมายเลขเริ่มต้น
  • 6 คือจำนวนผลลัพธ์ที่เป็นไปได้ (1 + เริ่ม(6) - สิ้นสุด(1) )

45
ขณะนี้สิ่งนี้จะได้ผล @Mike จะเป็นการดีที่สุดที่จะชี้ให้เห็นเวอร์ชันทั่วไปที่มีมากขึ้นเนื่องจาก Francisc มีด้านล่าง :-)
Raymond Machira

58
-1 หลังจาก Googling ฉันพบคำถามนี้ชื่อคือ "" สร้างค่าสุ่มระหว่างตัวเลขสองตัวใน Javascript " จะไม่ทำงานหากค่า min เป็น 0
Ydhem

18
ไม่ทำงานหากคุณต้องการตัวเลขระหว่างตัวเลขสองตัวที่ใหญ่กว่าเช่น Math.floor (Math.random () * 900) + 700
Rob

14
ใช้งานได้หากขั้นต่ำคือ 1 หากค่าต่ำสุดคือ 2 และเรายังคงใช้Math.floor(Math.random() * 6) + 2หมายความว่าถ้าMath.random()ผลลัพธ์เป็น 0.99 ค่าสุ่มของเราจะเป็น7
antitoxic

27
รหัสนี้ไม่ดีเพราะไม่สามารถใช้กับหมายเลขใด ๆ @ รหัส Francisc ถูกต้อง
Lion King

2283
function randomIntFromInterval(min, max) { // min and max included 
  return Math.floor(Math.random() * (max - min + 1) + min);
}

สิ่งที่มัน "พิเศษ" คือมันช่วยให้ช่วงเวลาแบบสุ่มที่ไม่ได้เริ่มต้นด้วย 1 ดังนั้นคุณสามารถรับจำนวนสุ่มจาก 10 ถึง 15 มีความยืดหยุ่น


5
สิ่งนี้ก็ยอดเยี่ยมเช่นกันเพราะถ้าใครบางคนไม่รวมtoarg แล้วfromarg ก็เพิ่มเป็นสองเท่าสูงสุด
Jason

12
สวัสดี. นี่คือจาก MDN: Returns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range.( developer.mozilla.org/en-US/docs/JavaScript/Reference/ ...... )
Francisc

5
อ่านความคิดเห็นข้างต้น การสุ่มอยู่ภายใน [0,1) ไม่ใช่ [0,1]
Francisc

3
ใช้งานได้ดีถ้าจำนวนที่ต่ำกว่าคือ 0
Robin Zimmermann

2
โปรดทราบว่าการแก้ปัญหานี้ถูกต้องเฉพาะเมื่อ min และ max เป็นจำนวนเต็มมิฉะนั้นคุณสามารถได้ผลลัพธ์ในช่วงเวลา [min, ceil (max)] นั่นคือคุณจะได้รับผลลัพธ์ที่อยู่นอกช่วงเนื่องจากสูงกว่าค่าสูงสุด
collimarco

326

Math.random ()

ส่งคืนตัวเลขสุ่มจำนวนเต็มระหว่างนาที ( รวม ) และสูงสุด ( รวมอยู่ด้วย ):

function randomInteger(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

หรือตัวเลขสุ่มใด ๆระหว่างขั้นต่ำ ( รวม ) และสูงสุด ( ไม่รวม ):

function randomNumber(min, max) {
  return Math.random() * (max - min) + min;
}

ตัวอย่างที่เป็นประโยชน์ (จำนวนเต็ม):

// 0 -> 10
Math.floor(Math.random() * 11);

// 1 -> 10
Math.floor(Math.random() * 10) + 1;

// 5 -> 20
Math.floor(Math.random() * 16) + 5;

// -10 -> (-2)
Math.floor(Math.random() * 9) - 10;

** และน่าจดจำเสมอ (Mozilla):

Math.random () ไม่ได้ให้ตัวเลขสุ่มที่ปลอดภัยเข้ารหัส อย่าใช้สิ่งใดก็ตามที่เกี่ยวข้องกับความปลอดภัย ใช้ Web Crypto API แทนและแม่นยำมากขึ้นกับวิธี window.crypto.getRandomValues ​​()


สิ่งที่ทำให้ฉันสับสน ... Math.floor (.. ) รับรองว่าตัวเลขเป็นจำนวนเต็มที่ Math.round (.. ) จะให้การแจกแจงที่ไม่สม่ำเสมอ Ref: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

1
ฉันเชื่อคำตอบนี้ ใครสามารถให้ลิงค์หรือคำอธิบายที่ชัดเจนว่าทำไมงานนี้? บางทีตัวอย่างของ Math.round จะให้อคติได้อย่างไรและทำไมจึงต้องใช้สูตรที่ค่อนข้างซับซ้อน
Robin Andrews

6
@alikuli สำหรับช่วงของ[1,2]มีโอกาส 25% Math.random()ที่จะทำให้คุณมีตัวเลขจากหนึ่งของเหล่านี้[0,0.49], [0.5,0.99], ,[1,1.49] [1.5,1.99]การปัดเศษช่วงเวลาเหล่านั้นจะทำให้ 0, 1, 1, 2 ซึ่งไม่ใช่การแจกแจงแบบสม่ำเสมอ การปูพื้นให้ผลลัพธ์เป็น 0, 0, 1, 1
pishpish

1
@shuji นี่คือคำตอบที่ถูกต้อง ฉันแค่ต้องการชี้แจงว่าทำไมการใช้Math.roundมากกว่าMath.floorจะให้ผลลัพธ์ที่แตกต่าง
pishpish

วิธีแก้ปัญหาที่แม่นยำที่สุดที่ฉันพบ: function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
Sadik

91

โซลูชั่นอื่น ๆ :

  • (Math.random() * 6 | 0) + 1
  • ~~(Math.random() * 6) + 1

ลองออนไลน์


6
คุณจะอธิบาย (หรือให้การอ้างอิง) sintaxis ~~ ได้ไหม? ฉันไม่เคยเห็นมาก่อน! ทางออกที่หรูหรา แต่ยากที่จะเข้าใจ
DiegoDD

27
Tilde สองเท่า ~~aและBitwise OR (a | 0) เป็นวิธีที่เร็วกว่าในการเขียน Math.floor (a)
edi9999

7
a | 0ยังเป็นวิธีที่เร็วที่สุดและปรับให้เหมาะสมที่สุดในการแปลงสตริงเป็นจำนวนเต็ม ใช้งานได้กับสตริงที่มีจำนวนเต็ม ( "444"และ"-444") เท่านั้นคือไม่มีลอยตัวหรือเศษส่วน มันให้ผลตอบแทน0สำหรับทุกสิ่งที่ล้มเหลว มันเป็นหนึ่งในการปรับปรุงหลักที่อยู่เบื้องหลัง asm.js
pilau

3
หมายเหตุ: หากคุณกำลังทำงานกับตัวเลขจำนวนมากจริงๆตัวหนอนสองตัวจะไม่ทำงาน ลอง~~(Math.random() * (50000000000000 - 0 + 1)) + 0และMath.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
BrunoLM

3
"ตัวหนอนสองตัวและค่าบิตหรือ / เป็นวิธีที่เร็วกว่าในการเขียน Math dot floor" เป็นโคลงบทกวีที่สวยงามที่ทำให้เช้าของฉันสดใสขึ้น ขอบคุณ @ edi9999!
teedyay

60

TL; DR

function generateRandomInteger(min, max) {
  return Math.floor(min + Math.random()*(max + 1 - min))
}

เพื่อให้ได้ตัวเลขสุ่ม generateRandomInteger(-20, 20);

คำอธิบายด้านล่าง

เราจำเป็นต้องได้รับจำนวนเต็มแบบสุ่มพูดXระหว่าง min และ max

ขวา?

ie min <= X <= สูงสุด

หากเราลบ min จากสมการนี่จะเท่ากับ

0 <= (X - นาที) <= (สูงสุด - นาที)

ทีนี้ลองคูณนี่ด้วยตัวเลขสุ่มr ซึ่งก็คือ

0 <= (X - นาที) * r <= (สูงสุด - นาที) * r

ทีนี้ลองเพิ่มนาทีกลับเข้าไปในสมการ

นาที <= นาที + (X - นาที) * r <= นาที + (สูงสุด - นาที) * r

ทีนี้มาเลือกฟังก์ชั่นที่ให้ผลลัพธ์เป็นrเพื่อให้สอดคล้องกับช่วงสมการของเราในฐานะ [min, max] สิ่งนี้เป็นไปได้ก็ต่อเมื่อ0 <= r <= 1

ตกลง. ทีนี้ช่วงของrคือ [0,1] นั้นใกล้เคียงกับผลลัพธ์ของฟังก์ชัน Math.random () ไม่ใช่เหรอ

ฟังก์ชัน Math.random () ส่งคืนตัวเลขทศนิยมแบบหลอกตัวในช่วง [0, 1); นั่นคือตั้งแต่ 0 (รวม) จนถึง แต่ไม่รวม 1 (พิเศษ)

ตัวอย่างเช่น,

กรณี r = 0

min+ 0 * ( max- min) = นาที

กรณี r = 1

min+ 1 * ( max- min) = สูงสุด

กรณีสุ่มโดยใช้ Math.random 0 <= r <1

min+ r * ( max- min) = Xโดยที่Xมีช่วงmin <= X < สูงสุด

ผลลัพธ์Xข้างต้นเป็นตัวเลขแบบสุ่ม อย่างไรก็ตามเนื่องจาก Math.random () ขอบด้านซ้ายของเรานั้นรวมอยู่ด้วยและขอบเขตด้านขวานั้นเป็นเอกสิทธิ์ หากต้องการรวมขอบเขตด้านขวาของเราเราจะเพิ่มขอบเขตขวาโดย 1 และเพิ่มผลลัพธ์

function generateRandomInteger(min, max) {
  return Math.floor(min + Math.random()*(max + 1 - min))
}

เพื่อให้ได้ตัวเลขสุ่ม

generateRandomInteger(-20, 20);



24
var x = 6; // can be any number
var rand = Math.floor(Math.random()*x) + 1;

2
จริง ฉันลืม rand เป็น 0 รวม ซ่อมมัน.
ryebr3ad

3
นั่นเป็นส่วนหนึ่งของ Pseudocode ... ใครบางคนอาจคิดว่ามันเป็นเรื่องจริงและลองใช้มันอย่างนั้น
แรงโน้มถ่วงบอย

35
@gravityboy คุณกำลังพูดถึงอะไร หากใครบางคนไม่สามารถแทนที่หมายเลขสำหรับ [เลือกหมายเลข ... ] พวกเขาอาจไม่เหมาะที่จะเป็นโปรแกรมเมอร์
ryebr3ad

7
@ ryebr3ad -1! มันบอกว่าในจาวาสคริปต์ไม่ได้อยู่ในรหัสหลอกและผู้อ่านไม่ทั้งหมดจะประสบความสำเร็จในการเขียนโปรแกรม หลายคนเป็นผู้เริ่มต้น!
Steve

3
@ ryebr3ad: ฉันมีเพื่อนร่วมงานที่สอนการฝึกงานเกี่ยวกับสภาพแวดล้อมฐานข้อมูลที่พวกเขาต้องการการสนับสนุน เขาบอกให้พวกเขาเลือกทุกอย่างออกจากตารางและพวกเขาเริ่มเขียน "เลือกทุกอย่างจาก ... " ในตัวแก้ไขคิวรี SQL เขามีปฏิกิริยาแบบเดียวกันกับที่คุณทำ
Ellesedil

22

jsfiddle: https://jsfiddle.net/cyGwf/477/

Random Integer : เพื่อรับจำนวนเต็มแบบสุ่มระหว่างminและmaxใช้รหัสต่อไปนี้

function getRandomInteger(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min;
}

จำนวนจุดลอยตัวแบบสุ่ม : เพื่อรับจำนวนจุดลอยตัวแบบสุ่มระหว่างminและmaxให้ใช้รหัสต่อไปนี้

function getRandomFloat(min, max) {
  return Math.random() * (max - min) + min;
}

การอ้างอิง: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random


14

คณิตศาสตร์ไม่ใช่จุดแข็งของฉัน แต่ฉันได้ทำงานในโครงการที่ฉันต้องการสร้างตัวเลขสุ่มจำนวนมากระหว่างทั้งบวกและลบ

function randomBetween(min, max) {
    if (min < 0) {
        return min + Math.random() * (Math.abs(min)+max);
    }else {
        return min + Math.random() * max;
    }
}

เช่น

randomBetween(-10,15)//or..
randomBetween(10,20)//or...
randomBetween(-200,-100)

แน่นอนคุณสามารถเพิ่มการตรวจสอบความถูกต้องบางอย่างเพื่อให้แน่ใจว่าคุณจะไม่ทำสิ่งนี้นอกเหนือจากตัวเลข ตรวจสอบให้แน่ใจว่าขั้นต่ำอยู่เสมอน้อยกว่าหรือเท่ากับสูงสุดเสมอ


5
นี่เป็นเพียงความผิด min + Math.random() * maxจะให้ตัวเลขระหว่าง min ถึง min + max ซึ่งไม่ใช่สิ่งที่คุณต้องการ สาขาแรกของifถูกต้อง แต่สามารถทำให้ง่ายขึ้นที่จะพูดreturn min + Math.random() * (max - min)ซึ่งเป็นทางออกที่ถูกต้องโดยไม่คำนึงว่า min เป็นบวกหรือลบ (ดูคำตอบอื่น ๆ ) นอกจากนี้โปรดจำไว้ว่าคุณยังต้องจัดผลลัพธ์หากคุณไม่ต้องการเศษส่วน
Avish

10

ฉันเขียนฟังก์ชั่นที่ยืดหยุ่นมากขึ้นซึ่งสามารถให้ตัวเลขสุ่มได้ แต่ไม่ใช่จำนวนเต็มเท่านั้น

function rand(min,max,interval)
{
    if (typeof(interval)==='undefined') interval = 1;
    var r = Math.floor(Math.random()*(max-min+interval)/interval);
    return r*interval+min;
}

var a = rand(0,10); //can be 0, 1, 2 (...) 9, 10
var b = rand(4,6,0.1); //can be 4.0, 4.1, 4.2 (...) 5.9, 6.0

รุ่นที่แก้ไขแล้ว


นี่ไม่ใช่วิธีแก้ปัญหาที่ดีเพราะจะใช้ไม่ได้กับค่าศูนย์เป็น min ดูคำตอบของ @ Lior
เซบาสเตียน

แน่นอนมันทำงานได้กับศูนย์เป็นค่าขั้นต่ำ คุณลอง? ไม่มีเหตุผลว่าทำไมมันอาจไม่ทำงาน มันจะไม่ทำงานกับ 0 เป็นช่วงเวลาที่ไม่แปลก (interval = 0? ... )
ElChupacabra

ฉันวิ่งฟังก์ชั่นนี้หลายครั้งโดยมีค่าศูนย์เป็นค่าต่ำสุดและไม่เคยได้ค่าศูนย์ในผลลัพธ์ หรือฉันไม่โชคดีพอ ...
เซบาสเตียน

คุณพูดถูก "+ ช่วงเวลา" ผิดตำแหน่ง ลองทดสอบดูสิ สิ่งที่แปลก ๆ ที่บางครั้ง console.log ให้ฉัน 0.300000004 แทน 0.3 เช่น 3 * 0.1 จะไม่เท่ากับ 0.3
ElChupacabra

9

ตัวอย่าง

ส่งคืนตัวเลขสุ่มระหว่าง 1 ถึง 10:

Math.floor((Math.random() * 10) + 1);

ผลลัพธ์อาจเป็น: 3

ลองด้วยตัวคุณเอง: ที่นี่

-

หรือใช้ lodash / undescore:

_.random(min, max)

Docs: - lodash - undescore


1
คุณต้องการ 9 หรือ 10 ใช่ไหม ถ้าใช่: const randomNumber = Math.floor ((Math.random () * 10) + 1) const nineOrTen = randomNumber% 2 === 0? 9: 10
Sebastián Lara

7

แม้คำตอบมากมายและผลลัพธ์เกือบเหมือนกัน ฉันต้องการเพิ่มคำตอบและอธิบายการทำงาน เนื่องจากเป็นสิ่งสำคัญที่จะต้องเข้าใจการทำงานของมันแทนที่จะคัดลอกการวางโค้ดหนึ่งบรรทัด การสร้างตัวเลขสุ่มไม่มีอะไรเลยนอกจากคณิตศาสตร์อย่างง่าย

รหัส:

function getR(lower, upper) {

  var percent = (Math.random() * 100);
  // this will return number between 0-99 because Math.random returns decimal number from 0-0.9929292 something like that
  //now you have a percentage, use it find out the number between your INTERVAL :upper-lower 
  var num = ((percent * (upper - lower) / 100));
  //num will now have a number that falls in your INTERVAL simple maths
  num += lower;
  //add lower to make it fall in your INTERVAL
  //but num is still in decimal
  //use Math.floor>downward to its nearest integer you won't get upper value ever
  //use Math.ceil>upward to its nearest integer upper value is possible
  //Math.round>to its nearest integer 2.4>2 2.5>3   both lower and upper value possible
  console.log(Math.floor(num), Math.ceil(num), Math.round(num));
}

6

ฉันค้นหาตัวสร้างตัวเลขสุ่มที่เขียนใน TypeScript และฉันได้เขียนสิ่งนี้หลังจากอ่านคำตอบทั้งหมดหวังว่ามันจะใช้ได้กับตัวแปลงสัญญาณ TypeScript

    Rand(min: number, max: number): number {
        return (Math.random() * (max - min + 1) | 0) + min;
    }   

5

Math.random() รวดเร็วและเหมาะสำหรับวัตถุประสงค์หลายอย่าง แต่มันไม่เหมาะสมถ้าคุณต้องการค่าที่ปลอดภัยแบบเข้ารหัส (ไม่ปลอดภัย) หรือถ้าคุณต้องการจำนวนเต็มจากการกระจายแบบไม่เอนเอียงที่สมบูรณ์แบบเหมือนกัน (วิธีการคูณที่ใช้ในคำตอบอื่น ๆ กว่าคนอื่น ๆ )

ในกรณีเช่นนี้เราสามารถใช้crypto.getRandomValues()เพื่อสร้างจำนวนเต็มที่ปลอดภัยและปฏิเสธค่าใด ๆ ที่สร้างขึ้นซึ่งเราไม่สามารถแมปอย่างสม่ำเสมอในช่วงเป้าหมาย สิ่งนี้จะช้าลง แต่ไม่ควรมีนัยสำคัญหากคุณไม่ได้สร้างคุณค่าจำนวนมาก

ในการชี้แจงข้อกังวลเกี่ยวกับการแจกแจงแบบเอนเอียงให้พิจารณากรณีที่เราต้องการสร้างค่าระหว่าง 1 ถึง 5 แต่เรามีตัวสร้างตัวเลขสุ่มที่สร้างค่าระหว่าง 1 ถึง 16 (ค่า 4 บิต) เราต้องการให้มีการแมปค่าที่สร้างขึ้นจำนวนเท่ากันกับแต่ละค่าเอาต์พุต แต่ 16 ไม่ได้แบ่งเท่า ๆ กัน 5: มันเหลือเศษ 1 ดังนั้นเราจำเป็นต้องปฏิเสธ 1 ค่าที่สร้างขึ้นได้และต่อเมื่อเราได้รับเท่านั้น หนึ่งใน 15 ค่าที่น้อยกว่าซึ่งสามารถแมปอย่างสม่ำเสมอในช่วงเป้าหมายของเรา พฤติกรรมของเราอาจมีลักษณะเหมือนรหัสเทียมนี้:

Generate a 4-bit integer in the range 1-16.
If we generated  1,  6, or 11 then output 1.
If we generated  2,  7, or 12 then output 2.
If we generated  3,  8, or 13 then output 3.
If we generated  4,  9, or 14 then output 4.
If we generated  5, 10, or 15 then output 5.
If we generated 16 then reject it and try again.

รหัสต่อไปนี้ใช้ตรรกะที่คล้ายกัน แต่สร้างจำนวนเต็ม 32 บิตแทนเพราะนั่นเป็นขนาดจำนวนเต็มทั่วไปที่ใหญ่ที่สุดที่สามารถแสดงด้วยnumberชนิดมาตรฐานของ JavaScript (สิ่งนี้สามารถแก้ไขเพื่อใช้BigInts หากคุณต้องการช่วงที่ใหญ่กว่า) โดยไม่คำนึงถึงช่วงที่เลือกเศษส่วนของค่าที่สร้างขึ้นที่ถูกปฏิเสธจะน้อยกว่า 0.5 เสมอดังนั้นจำนวนการปฏิเสธที่คาดหวังจะน้อยกว่า 1.0 และ มักจะใกล้กับ 0.0; คุณไม่จำเป็นต้องกังวลเกี่ยวกับมันวนซ้ำตลอดไป

const randomInteger = (min, max) => {
  const range = max - min;
  const maxGeneratedValue = 0xFFFFFFFF;
  const possibleResultValues = range + 1;
  const possibleGeneratedValues = maxGeneratedValue + 1;
  const remainder = possibleGeneratedValues % possibleResultValues;
  const maxUnbiased = maxGeneratedValue - remainder;

  if (!Number.isInteger(min) || !Number.isInteger(max) ||
       max > Number.MAX_SAFE_INTEGER || min < Number.MIN_SAFE_INTEGER) {
    throw new Error('Arguments must be safe integers.');
  } else if (range > maxGeneratedValue) {
    throw new Error(`Range of ${range} (from ${min} to ${max}) > ${maxGeneratedValue}.`);
  } else if (max < min) {
    throw new Error(`max (${max}) must be >= min (${min}).`);
  } else if (min === max) {
    return min;
  } 

  let generated;
  do {
    generated = crypto.getRandomValues(new Uint32Array(1))[0];
  } while (generated > maxUnbiased);

  return min + (generated % possibleResultValues);
};

console.log(randomInteger(-8, 8));          // -2
console.log(randomInteger(0, 0));           // 0
console.log(randomInteger(0, 0xFFFFFFFF));  // 944450079
console.log(randomInteger(-1, 0xFFFFFFFF));
// Error: Range of 4294967296 covering -1 to 4294967295 is > 4294967295.
console.log(new Array(12).fill().map(n => randomInteger(8, 12)));
// [11, 8, 8, 11, 10, 8, 8, 12, 12, 12, 9, 9]


ตอนนี้นี่คือสิ่งที่ฉันเรียกว่า overkill
2xSamurai

2
@ 2xSamurai ที่นั่นฉันได้อัพเดตคำตอบเพื่ออธิบายว่าทำไมคุณถึงต้องใช้มันและมันทำงานอย่างไร ที่ดีกว่า? : P
Jeremy Banks

มันไม่ใช่ overkill เลยถ้าคุณต้องการตัวเลขสุ่มเข้ารหัสที่ปลอดภัยและกระจายอย่างสม่ำเสมอ การสร้างตัวเลขสุ่มที่ตรงกับความต้องการเหล่านั้นยาก คำตอบที่ดี @JeremyBanks
thomaskonrad

4

การเพิ่มfloatด้วยเวอร์ชันความแม่นยำคงที่ขึ้นอยู่กับintเวอร์ชันใน @ คำตอบของ Francisc:

function randomFloatFromInterval (min, max, fractionDigits) {
  const fractionMultiplier = Math.pow(10, fractionDigits)
  return Math.round(
    (Math.random() * (max - min) + min) * fractionMultiplier,
  ) / fractionMultiplier
}

ดังนั้น:

randomFloatFromInterval(1,3,4) // => 2.2679, 1.509, 1.8863, 2.9741, ...

และสำหรับคำตอบที่แท้จริง

randomFloatFromInterval(1,3,0) // => 1, 2, 3



1

ฉันค้นพบวิธีใหม่ที่ยอดเยี่ยมในการทำเช่นนี้โดยใช้พารามิเตอร์เริ่มต้นของ ES6 มันเป็นเรื่องที่ดีมากเพราะอนุญาตให้มีอาร์กิวเมนต์หนึ่งหรือสองอาร์กิวเมนต์ นี่มันคือ:

function random(n, b = 0) {
    return Math.random() * (b-n) + n;
}

1

นี่เป็นเวลาประมาณเก้าปีที่ผ่านมา แต่randojs.comทำให้เป็นหนึ่งซับง่าย:

rando(1, 6)

คุณเพียงแค่เพิ่มสิ่งนี้ลงในส่วนหัวของเอกสาร html ของคุณและคุณสามารถทำได้ทุกอย่างที่คุณต้องการด้วยการสุ่มได้อย่างง่ายดาย ค่าแบบสุ่มจากอาร์เรย์องค์ประกอบ jquery แบบสุ่มคุณสมบัติแบบสุ่มจากวัตถุและแม้แต่ป้องกันการทำซ้ำหากจำเป็น

<script src="https://randojs.com/1.0.0.js"></script>

เพิ่มการพึ่งพาที่จะทำสิ่งที่มีอยู่แล้วหนึ่งซับ? ความหลงใหลในการเพิ่มห้องสมุดในชุมชน JS เป็นบ้า
Daniel Cooke

ง่ายต่อการอ่านและจดจำ ฉันเห็นด้วยแม้ว่า
Aaron Plocharczyk

1

สิ่งนี้ใช้ได้สำหรับฉันและสร้างค่าเช่นฟังก์ชันไลบรารีมาตรฐานrandom.randintของ Python :


function randint(min, max) {
   return Math.round((Math.random() * Math.abs(max - min)) + min);
}

console.log("Random integer: " + randint(-5, 5));


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