Je tente de générer un nombre aléatoire avec une distribution logarithmique.Java: Générer un nombre aléatoire avec une distribution logarithmique
Où n = 1 se produit la moitié du temps, n = 2 se produit un quart du temps, n = 3 se produit un huitième du temps, etc.
int maxN = 5;
int t = 1 << (maxN); // 2^maxN
int n = maxN -
((int) (Math.log((Math.random() * t))
/Math.log(2))); // maxN - log2(1..maxN)
System.out.println("n=" + n);
La plupart du temps, je suis obtenir le résultat dont j'ai besoin, mais une fois de temps en temps, j'ai une valeur de n
qui est supérieure à maxN
.
Pourquoi est-ce ainsi? La façon dont je le vois, la valeur maximale de Math.random()
est 1,0; Par conséquent, la valeur maximale de (Math.random() * t))
est t
donc la valeur maximale de log2 (t) est maxN, puisque t = 2^maxN;
Où ma logique a-t-elle dérapé?
Merci
+1 @ abhin4v: Merci pour le commentaire! – bguiz
J'ai eu le chèque, alors vous l'avez pris! –
+ check @ abhin4v: Vous avez raison à propos de log (t)/log (2)> maxN L'erreur était "cachée" en raison de la conversion en 'int', mais c'est une façon plus appropriée d'un point de vue émathématique. – bguiz