2009-11-28 14 views
0

Voici donc une des choses les plus simples qu'on pourrait faire:java.util.Random particularité

Random rng = new Random(); 
int a = rng.nextInt(10); 
int b = rng.nextInt(10); 

Jusqu'à présent, si bon. Mais nous voulons éviter d'avoir égale a et b, si naturellement nous:

Random rng = new Random(); 
int a = rng.nextInt(10); 
int b = rng.nextInt(10); 
while (a == b){ 
    b = rng.nextInt(10); 
} 

Cependant - à mon très très très grande surprise - la boucle while jamais de sorties. Jamais.

Je comprends que, en théorie, avec des nombres aléatoires, pourrait avoir une séquence infinie d'un nombre. Mais j'ai eu ce code courant pendant 10 minutes maintenant et il n'a pas quitté la boucle.

Quoi de neuf? Je cours JDK 6 Update 16 sur le dernier Linux Mint.

+1

Bizarre. Avez-vous essayé d'initialiser Random avec une graine? Aléatoire r = nouveau Aléatoire (19580427); –

+2

Fonctionne comme prévu pour moi. Java 1.6 u17. Publiez une classe complète, y compris les importations, qui reproduit le problème. – erickson

+0

Que basiacally est le code complet. Il retourne juste a et b en tant que tableau char après cela. La seule chose qui pourrait causer cela pourrait être que la méthode est statique. Attends, je vais essayer. –

Répondre

7
Random rng = new Random(); 
    int a = rng.nextInt(10); 
    int b = rng.nextInt(9); 
    if (b >= a) ++b; 

Problème résolu!

+0

ne devrait-il pas être si (b == a) '? –

+0

Non. Si vous faisiez cela, vous obtiendriez un +1 deux fois plus souvent que les autres numéros. –

+0

Non, car alors vous perdez la possibilité de choisir 9, et vous doublez la probabilité de 'a + 1'. Nous supprimons a de l'ensemble des possibilités pour b en déplaçant [a + 1,10) vers le bas 1, pour enlever le trou laissé par a. – Thanatos

4

Je ne sais pas pourquoi cela se produirait - je l'ai essayé en 1.6.0_16 pour Windows et n'ai eu aucun problème. Voici la classe complète:

import java.util.Random; 
public class Test { 
    public static void main(String[] args) { 
     Random rng = new Random(); 
     int a = rng.nextInt(10); 
     int b = rng.nextInt(10); 
     while (a == b){ 
      System.out.println(b + " is equal to " + a + "!"); 
      b = rng.nextInt(10); 
     } 
     System.out.println(a); 
     System.out.println(b); 
    } 
} 

Parfois, je vais obtenir le "a est égal à b!" sortie une ou deux fois de suite, mais cela fonctionne ensuite.

+1

Donc l'échec est dans quelque chose Linux Mint est –

+1

RocketSurgeon: Regardez le code pour java.util.Random(). Je doute fortement qu'il y ait des dépendances de système d'exploitation qui pourraient changer le résultat. – Joey

+0

+1 - D'après cette preuve, il semble que les paquets "Linux Mint" pour Java soient cassés et ne soient pas fiables. –

0

Vous pourriez essayer de placer la graine à autre chose pour voir si cela aide.

rng.setSeed (123456);

1

Pratiquement, cela devrait fonctionner. Quelque chose ne va pas avec votre environnement.

Cependant, théoriquement, nous ne pouvons pas prédire ce qui est aléatoire; C'est légitime si un générateur aléatoire vous donne le même nombre un million de fois de suite. Pour avoir un code déterministe, vous pouvez le faire:

int a = rng.nextInt(10); 
int b = rng.nextInt(9); 
b = (a+b+1)%10;