On m'a donné la tâche de porter le (qui est un port presque direct du code code> java.util.random () code>) ne fonctionnera pas correctement, car JavaScript peut ' Les opérations bitwises sur un entier de cette taille.) p> J'ai compris que je peux simplement créer un générateur de nombres aléatoires semisable dans un espace 32 bits à l'aide de l'algorithme de Léhmer, mais l'astuce est que j'ai besoin que j'ai besoin Pour obtenir les mêmes valeurs que je le ferais avec java.util.random () code> à JavaScript, et j'ai coulé sur une énorme performance Hit / inaccracy à l'aide des opérateurs Bitwise en JavaScript sur suffisamment grand Nombres. Certaines recherches superficielles indiquent que "les opérateurs bitwises en JavaScript sont inhérents", car à l'interne, il apparaît que JavaScript lancera toutes ses valeurs doubles dans des entiers 32 bits signés pour effectuer les opérations bitwises ( voir ici pour plus d'informations sur ceci.) À cause de cela, je ne peux pas faire un port direct du numéro aléatoire Java générateur, et j'ai besoin d'obtenir les mêmes résultats numériques que
java.util.random () code>. Écrire quelque chose comme
java.util.random () code>. Que dois-je faire pour faire un port fonctionnel plus rapide? P> p>
4 Réponses :
Les opérations bits 48 bits ne sont pas possibles dans JavaScript. Vous pouvez utiliser deux chiffres pour simuler cependant. P>
Une alternative consiste à utiliser un réseau booléen de 48 booléens et à mettre en œuvre le changement de vitesse. Je ne sais pas si cela est plus rapide, cependant; Mais j'en doute, car tous les booléens sont stockés comme doubles. P>
Gardez à l'esprit qu'un changement de bit est directement équivalent à une multiplication ou de division par une puissance de 2.
1 << x == 1 * Math.pow(2,x)
au lieu de Tous les numéros en JavaScript sont des numéros de points flottants de 64 bits, qui suffit à représenter tout entier de 48 bits. p> foo & ((((1 << 48) - 1) code> Vous devriez pouvoir utiliser
foo% math.pow (2,48) code>. p>