Mi è stato affidato il compito di eseguire il porting di Java Java.util.Random()
in JavaScript e ho riscontrato un enorme successo/inaccuratezza delle prestazioni utilizzando operatori bit a bit in Javascript su numeri sufficientemente grandi. Alcune ricerche sommarie affermano che "gli operatori bit a bit in JavaScript sono intrinsecamente lenti", perché internamente sembra che JavaScript trasmetterà tutti i suoi doppi valori in numeri interi a 32 bit con segno per eseguire operazioni bit a bit (see here per ulteriori informazioni su questo.) A causa di questo , Non posso fare una porta diretta del generatore di numeri casuali Java, e ho bisogno di ottenere gli stessi risultati numerici come Java.util.Random()
. Scrivendo qualcosa comeOperazioni bit a bit a 48 bit in Javascript?
this.next = function(bits) {
if (!bits) {
bits = 48;
}
this.seed = (this.seed * 25214903917 + 11) & ((1 << 48) - 1);
return this.seed >>> (48 - bits);
};
(che è una porta quasi-diretta del Java.util.Random()
) codice non funzionerà correttamente, dal momento che Javascript non può fare operazioni bit per bit su un numero intero di quelle dimensioni.)
I' Ho capito che posso semplicemente creare un generatore di numeri casuali seedable nello spazio a 32 bit usando l'algoritmo Lehmer, ma il trucco è che ho bisogno di ottenere gli stessi valori come con Java.util.Random()
. Cosa devo fare per realizzare una porta più veloce e funzionale?