Willekeurige gehele getallen genereren in JavaScript in een specifiek bereik?
Hoe kan ik willekeurige gehele getallen genereren tussen twee gespecificeerde variabelen in JavaScript, bijv. x = 4
en y = 8
zou een willekeurig van 4, 5, 6, 7, 8
opleveren?
1823
3
Er staan enkele voorbeelden op de Mozilla Developer Network pagina:
Hier is de logica erachter. Het is een simpele regel van drie:
Math.random()
geeft eengetal
tussen 0 (inclusief) en 1 (exclusief). Dus we hebben een interval als dit:Nu, we willen een getal tussen
min
(inclusief) enmax
(exclusief):We kunnen
Math.random
gebruiken om de overeenkomstige waarde in het [min, max] interval te krijgen. Maar, eerst moeten we het probleem een beetje ontbinden doormin
van het tweede interval af te trekken:Dit geeft:
We kunnen nu
Math.random
toepassen en dan het overeenkomstige uitrekenen. Laten we een willekeurig getal kiezen:Dus, om
x
te vinden, zouden we doen:Vergeet niet
min
weer toe te voegen, zodat we een getal in het [min, max] interval krijgen:Dat was de eerste functie van MDN. De tweede, geeft een geheel getal tussen
min
enmax
, beide inclusief.Om gehele getallen te krijgen, kun je
round
,ceil
offloor
gebruiken.Je zou
Math.round(Math.random() * (max - min)) + min
, dit geeft echter een ongelijke verdeling. Zowelmin
alsmax
hebben maar ongeveer de helft van de kans om te rollen:Als
max
van het interval wordt uitgesloten, heeft deze nog minder kans om te rollen danmin
.Met
Math.floor(Math.random() * (max - min +1)) + min
heb je een perfect gelijke verdeling.Je kunt
ceil()
en-1
niet gebruiken in die vergelijking omdatmax
nu iets minder kans had om te rollen, maar je kunt het (ongewenste)min-1
resultaat ook rollen.gebruik:
Om deze functie, en variaties op deze functie, te testen, sla de onderstaande HTML/JavaScript op in een bestand en open het met een browser. De code zal een grafiek maken met de verdeling van een miljoen functie-aanroepen. De code zal ook de randgevallen registreren, dus als de functie een waarde produceert die groter is dan de max, of kleiner dan de min, dan.zul.je.dat.weten.