Perché se utilizzo il generatore di numeri casuali e l'intervallo 0 - 9 non ottengo la stessa distribuzione uniforme combinata con la funzione floor?Numeri casuali e funzione floor vs round
risposta
Math.floor(Math.random() * 10)
fornisce una distribuzione abbastanza uniforme, mentre Math.round(Math.random() * 10)
no.
Math.floor() restituisce 0 per ogni valore nell'intervallo [0, 1) (1 esclusivo), 1 per ogni valore nell'intervallo [1, 2), ecc
Quindi, se abbiamo uguali possibilità di ottenere un numero in uno di questi intervalli, otterremo una uguale distribuzione di 0 e 1.
Math.round(), invece, restituisce 0 per i valori sotto 0.5, 1 per valori inferiori a 1,5, ecc
Quindi in realtà abbiamo la metà delle probabilità di ottenere un 0, come valori solo da 0 a 0,5 arrotonderà a 0.
╔═════════╦═════════╦═════════╗
║ Range ║ floor() ║ round() ║
╠═════════╬═════════╬═════════╣
║ [0, 1) ║ 0 ║ 0 or 1 ║
║ [1, 2) ║ 1 ║ 1 or 2 ║
║ [2, 3) ║ 2 ║ 2 or 3 ║
║ ... ║ ... ║ ... ║
║ [9, 10) ║ 9 ║ 9 or 10 ║
╚═════════╩═════════╩═════════╝
sì, è quello che sto facendo al momento. Ma sto chiedendo ** perché ** senza pavimento questa distribuzione non è così uniforme come con il pavimento. – user336635
@ user336635: http://jsfiddle.net/pimvdb/fPJ6Q/ Abbastanza uniforme ... – pimvdb
Immagina una linea su carta millimetrata, lunga 10 quadrati. 0 a sinistra, 10 a destra, 5 a destra nel mezzo. Se usi round(), quindi la regione a mezzo quadrato a sinistra di 5, * e * a metà di un quadrato a destra di 5, verrà mappata a 5. Tuttavia, solo metà di un quadrato a destra di 0 esegue lo 0, non c'è mezzo a quadrato a sinistra di 0 sulla linea. Quando si usa floor(), solo i valori di un quadrato a destra di n verranno mappati e si riduce il numero di risultati possibili, in quanto non è possibile ottenere 10 di più. Tuttavia, ognuno dei 10 possibili risultati (0-9 inc) ha la stessa "condivisione" della linea, e quindi le stesse probabilità di occorrenza. – Sophistifunk
mi piace molto per far scattare 31 bit int invece di Math.floor()
, facendo una "o 0" un'operazione binaria. Lo rende leggermente più veloce (stack vs heap,) sembra un tad più ordinato, e fa la stessa cosa, in senso pratico. Ecco un esempio che ottiene un elemento casuale di un array:
var ar=[1,2,3,4,5,6,7,8,9,0,'a','b','c','d']
console.log(ar[(Math.random() * ar.length) |0])
Questo potrebbe sembrare ottimizzazione prematura, ma come ho detto, mi piace come appare, e ci vuole meno di battitura di Math.floor()
. Utilizzando Math.round()
richiederebbe un passo in più (perché lo spread è 1
-ar.length
non 0
-ar.length-1
)
Come sai che è leggermente più veloce e, scusa la mia ignoranza, che cos'è lo stack rispetto all'heap? So che hanno qualcosa a che fare con algoritmi di ordinamento – Anthony
https://jsperf.com/random-array-item mostra che è leggermente più veloce sul mio browser (in media circa ± 0,5% - x ± 0,8% su Mac Chrome versione 58.0 .3029.110 (64-bit)) ecco di più sullo stack/heap: http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap il '| 0' lo forza in int32 (lo arrotonda e lo digita) in modo che possa sedersi nello stack, dove i numeri generali sono sempre nell'heap (nel caso in cui finiscano più grandi o abbiano un punto decimale.) – konsumer
Non è un'enorme differenza di velocità, ma è piccolo, e come ho detto, penso che sia anche bello. – konsumer
- 1. CGFloat: round, floor, abs e precisione 32/64 bit
- 2. Numeri casuali e negativi
- 3. Haskell e numeri casuali
- 4. variabile cast alla funzione int vs round()
- 5. Numeri int64 e float64 casuali
- 6. C# probabilita 'e numeri casuali
- 7. Seed() e numeri casuali in Python
- 8. Numeri casuali non ripetuti
- 9. numeri casuali in PySpark
- 10. Numeri casuali ponderati
- 11. Numeri casuali con C#
- 12. distribuzione dei numeri casuali
- 13. numeri casuali probabilità
- 14. Python's pythonto library per generazione di numeri casuali vs os.urandom
- 15. speciale di numeri casuali
- 16. C++ 11 numeri casuali
- 17. Numeri casuali in C
- 18. Analisi numeri casuali
- 19. Generazione contemporanea di numeri casuali
- 20. Cosa succede quando si copia un motore di numeri casuali e una distribuzione di numeri casuali?
- 21. Spark - Generazione di numeri casuali
- 22. Genera numeri casuali senza utilizzare alcuna funzione esterna
- 23. Come posso generare numeri casuali senza funzione rand()?
- 24. SQL Server: riempire una colonna con numeri decimali casuali
- 25. Come generare numeri casuali diversi?
- 26. Boost generatore di numeri casuali
- 27. c - generatore di numeri casuali
- 28. Generatore di numeri casuali Crossplatform
- 29. Algoritmo per numeri casuali "lisci"
- 30. Numeri casuali protetti in javascript?
si può aggiungere codice di esempio? (e per il credito extra, alcuni dati statistici che confrontano entrambi e dimostra il problema) –