Generare numeri interi casuali in JavaScript in un intervallo specifico?
Come posso generare numeri interi casuali tra due variabili specificate in JavaScript, ad esempio x = 4
e y = 8
produrrebbero qualsiasi 4, 5, 6, 7, 8
?
1823
3
Ci sono alcuni esempi nella pagina Mozilla Developer Network:
hr>
Ecco la logica che c'è dietro. È una semplice regola del tre:
Math.random()
restituisce unNumero
tra 0 (incluso) e 1 (esclusivo). Quindi abbiamo un intervallo come questo:Ora, vorremmo un numero tra
min
(incluso) emax
(esclusivo):Possiamo usare il
Math.random
per ottenere il corrispondente nell'intervallo [min, max]. Ma, prima dobbiamo fattorizzare un po' il problema sottraendomin
dal secondo intervallo:Questo dà:
Possiamo ora applicare
Math.random
e calcolare il corrispondente. Scegliamo un numero casuale:Quindi, per trovare
x
, dovremmo fare:Non dimenticare di aggiungere
min
, in modo da ottenere un numero nell'intervallo [min, max]:Questa era la prima funzione della MDN. La seconda, restituisce un numero intero tra
min
emax
, entrambi inclusi.Ora, per ottenere numeri interi, potresti usare
round
,ceil
ofloor
.Potresti usare
Math.round(Math.random() * (max - min)) + min
, questo però dà una distribuzione non uniforme. Entrambi,min
emax
hanno solo circa la metà delle possibilità di tirare:Con
max
escluso dall'intervallo, ha ancora meno possibilità di tirare rispetto amin
.Con
Math.floor(Math.random() * (max - min +1)) + min
si ha una distribuzione perfettamente uniforme.Non puoi usare
ceil()
e-1
in questa equazione perchémax
ha ora una possibilità in meno di tirare, ma puoi tirare anche il risultato (indesiderato)min-1
.uso:
Per testare questa funzione, e variazioni di questa funzione, salvate il seguente HTML/JavaScript in un file e apritelo con un browser. Il codice produrrà un grafico che mostra la distribuzione di un milione di chiamate di funzione. Il codice registrerà anche i casi limite, quindi se la funzione produce un valore maggiore del massimo, o minore del minimo, voi lo saprete.