149 votes

Math.random () contre Random.nextInt (int)

Quelle est la différence entre Math.random() * n et Random.nextInt(n)n est un entier?

187voto

matt b Points 73770

Voici l'explication de pourquoi "Random.nextInt(n) est à la fois plus efficace et moins biaisé que l' Math.random() * n" du Soleil les forums que Gili lié à:

Les mathématiques.random() utilise Aléatoire.nextDouble() en interne.

Aléatoire.nextDouble() utilise Aléatoire.next() deux fois pour générer un double qui a environ répartie uniformément bits dans sa mantisse, de sorte qu'il est distribué uniformément dans l'intervalle de 0 à 1-(2^-53).

Aléatoire.nextInt(n) utilise Aléatoire.next() moins de deux fois supérieure à la moyenne -, il l'utilise une fois, et si la valeur obtenue est supérieure à la plus haute multiple de n ci-dessous MAX_INT il essaie de nouveau, sinon renvoie la valeur modulo n (ce qui empêche les valeurs ci-dessus le plus grand multiple de n ci-dessous MAX_INT l'inclinaison de la distribution), afin de retourner une valeur qui est distribuée de manière uniforme dans l'intervalle de 0 à n-1.

Avant la mise à l'échelle en 6, la sortie de Mathématiques.random() est l'une des 2^53 valeurs possibles élaboré à partir d'une distribution uniforme.

Mise à l'échelle en 6 ne modifie pas le nombre de valeurs possibles, et la conversion d'un int alors les forces de ces valeurs dans l'un des six seaux' (0, 1, 2, 3, 4, 5), chaque segment correspondant à des plages englobant soit 1501199875790165 ou 1501199875790166 des valeurs possibles (comme 6 n'est pas un disvisor de 2^53). Cela signifie que pour un nombre suffisant de jets de dés (ou d'une filière, d'un nombre suffisamment important de côtés), la filière sera se montrer à être orientés vers les grands seaux.

Vous serez en attente d'un temps très long roulement de dés pour cet effet de le montrer.

Les mathématiques.random() nécessite également environ deux fois le traitement et est soumis à la synchronisation.

28voto

dfa Points 54490

Un autre point important est que Random.nextInt (n) est répétable puisque vous pouvez créer deux objets Random avec la même graine. Ce n'est pas possible avec Math.random ().

15voto

Gili Points 14674

Selon https://forums.oracle.com/forums/thread.jspa?messageID=6594485&#6594485% Random.nextInt(n) est à la fois plus efficace et moins biaisé que Math.random() * n

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X