Obtenir un booléen aléatoire en Java

Ok, j’ai implémenté cette question SO dans mon code: Return True ou False Aléatoire

Mais, j’ai un comportement étrange: j’ai besoin d’exécuter dix instances simultanément, où chaque instance retourne true ou false une seule fois par exécution. Et étonnamment, peu importe ce que je fais, chaque fois que je suis juste false

Y a-t-il quelque chose à améliorer pour que je puisse avoir au moins environ 50% de chances de réussir?


Pour le rendre plus compréhensible: mon application est construite sur un fichier JAR qui est ensuite exécuté via la commande batch

  java -jar my-program.jar pause 

Contenu du programme – pour le rendre aussi simple que possible:

 public class myProgram{ public static boolean getRandomBoolean() { return Math.random() < 0.5; //I tried another approaches here, still the same result } public static void main(String[] args) { System.out.println(getRandomBoolean()); } } 

Si j’ouvre 10 lignes de commande et que je l’exécute, je deviens false à chaque fois …

Je recommande d’utiliser Random.nextBoolean()

Cela étant dit, Math.random() < 0.5 comme vous l’avez déjà utilisé. Voici le comportement sur ma machine:

 $ cat myProgram.java public class myProgram{ public static boolean getRandomBoolean() { return Math.random() < 0.5; //I tried another approaches here, still the same result } public static void main(String[] args) { System.out.println(getRandomBoolean()); } } $ javac myProgram.java $ java myProgram ; java myProgram; java myProgram; java myProgram true false false true 

Inutile de dire qu'il n'y a aucune garantie d'obtenir des valeurs différentes à chaque fois. Dans votre cas, cependant, je soupçonne que

A) vous ne travaillez pas avec le code que vous pensez être (comme éditer le mauvais fichier)

B) vous n'avez pas compilé vos différentes tentatives lors des tests, ou

C) vous travaillez avec une implémentation rompue non standard.

Vous pouvez également essayer nextBoolean() -Method

Voici un exemple: http://www.tutorialspoint.com/java/util/random_nextboolean.htm

Avez-vous essayé de regarder la documentation de Sun (oracle)?

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextBoolean ()

de toute façon, voici un exemple de code:

  java.util.Random Random random = new Random(); random.nextBoolean(); 

Pourquoi ne pas utiliser la classe Random , qui a une méthode nextBoolean :

 import java.util.Random; /** Generate 10 random booleans. */ public final class MyProgram { public static final void main(Ssortingng... args){ Random randomGenerator = new Random(); for (int idx = 1; idx <= 10; ++idx){ boolean randomBool = randomGenerator.nextBoolean(); System.out.println("Generated : " + randomBool); } } } 

Java 8 : Utiliser un générateur aléatoire isolé sur le thread actuel: ThreadLocalRandom nextBoolean ()

Comme le générateur aléatoire global utilisé par la classe Math, un ThreadLocalRandom est initialisé avec une graine générée en interne qui ne peut pas être modifiée autrement. S’il y a lieu, l’utilisation de ThreadLocalRandom plutôt que d’objects partagés dans des programmes concurrents entraînera généralement moins de surcharge et de conflits.

 java.util.concurrent.ThreadLocalRandom.current().nextBoolean(); 

La méthode la plus simple pour initialiser un générateur de nombres aléatoires consiste à utiliser le constructeur sans paramètre, par exemple

 Random generator = new Random(); 

Cependant, en utilisant ce constructeur, vous devez reconnaître que les générateurs de nombres aléatoires algorithmiques ne sont pas vraiment aléatoires, ce sont en réalité des algorithmes qui génèrent une séquence de nombres fixe mais aléatoire.

Vous pouvez le faire apparaître plus aléatoire en donnant au constructeur Random le paramètre ‘seed’, que vous pouvez construire dynamicment, par exemple, en utilisant l’heure système en millisecondes (ce qui sera toujours différent)

vous pouvez obtenir votre valeur d’horloge () et vérifier si elle est impaire ou paire. Je ne sais pas si c’est% 50 de vrai

Et vous pouvez créer votre fonction aléatoire de manière personnalisée:

 static double s=System.nanoTime();//in the instantiating of main applet public static double randoom() { s=(double)(((555555555* s+ 444444)%100000)/(double)100000); return s; } 

numéros 55555 .. et 444 .. sont les grands nombres pour obtenir une fonction de large gamme s’il vous plaît ignorer cette icône skype: D

Vous pouvez également créer deux nombres entiers aléatoires et vérifier s’ils sont identiques, cela vous donne plus de contrôle sur les probabilités.

 Random rand = new Random(); 

Déclarez une plage pour gérer la probabilité aléatoire. Dans cet exemple, il y a 50% de chances d’être vrai.

 int range = 2; 

Génère 2 nombres entiers aléatoires.

 int a = rand.nextInt(range); int b = rand.nextInt(range); 

Ensuite, comparez simplement la valeur retournée.

 return a == b; 

J’ai aussi un cours que vous pouvez utiliser. RandomRange.java

  • Générer un nombre aléatoire entier, INTEGER_RANDOM_NUMBER

  • retour (INTEGER_RANDOM_NUMBER & 1)