En d'autres termes, il ne générera jamais plus de 16 nombres pairs à la suite avec un certain nombre de chiffres spécifiques. upperBound
paramètres :
Random random = new Random();
int c = 0;
int max = 17;
int upperBound = 18;
while (c <= max) {
int nextInt = random.nextInt(upperBound);
boolean even = nextInt % 2 == 0;
if (even) {
c++;
} else {
c = 0;
}
}
Dans cet exemple, le code bouclera indéfiniment, alors que lorsque upperBound
est, par exemple, de 16, il se termine rapidement.
Quelle peut être la raison de ce comportement ? Il y a quelques notes dans la javadoc de la méthode, mais je n'ai pas réussi à les comprendre.
UPD1 : Le code semble se terminer avec des limites supérieures impaires, mais peut rester bloqué avec des limites paires.
UPD2 : J'ai modifié le code pour capturer les statistiques de c
comme suggéré dans les commentaires :
Random random = new Random();
int c = 0;
long trials = 1 << 58;
int max = 20;
int[] stat = new int[max + 1];
while (trials > 0) {
while (c <= max && trials > 0) {
int nextInt = random.nextInt(18);
boolean even = nextInt % 2 == 0;
if (even) {
c++;
} else {
stat[c] = stat[c] + 1;
c = 0;
}
trials--;
}
}
System.out.println(Arrays.toString(stat));
Maintenant, il essaie d'atteindre 20
pairs dans la rangée - pour obtenir de meilleures statistiques, et le upperBound
est toujours 18
.
Les résultats se sont révélés plus que surprenants :
[16776448, 8386560, 4195328, 2104576, 1044736,
518144, 264704, 132096, 68864, 29952, 15104,
12032, 1792, 3072, 256, 512, 0, 256, 0, 0]
Au début, il diminue comme prévu par le facteur 2, mais notez la dernière ligne ! Ici, ça devient fou et les statistiques capturées semblent être complètement bizarres.
Voici un diagramme à barres en échelle logarithmique :
Comment c
obtient la valeur 17
256 fois est encore un autre mystère