Obtenir un booléen aléatoire en Java
D'accord, j'ai implémenté cette question SO dans mon code: Retourne True ou False au hasard
Mais, j'ai un comportement étrange: j'ai besoin d'exécuter dix instances simultanément, où chaque instance renvoie true ou false une seule fois par exécution. Et étonnamment, peu importe ce que je fais, chaque fois que je reçois juste false
Y a-t-il quelque chose pour améliorer la méthode afin que je puisse avoir au moins environ 50% de chances d'obtenir true
?
Pour le rendre plus compréhensible: j'ai ma demande construit dans 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, j'obtiens false
comme résultat à chaque fois...
9 answers
Je vous recommande d'utiliser Random.nextBoolean()
Cela étant dit, Math.random() < 0.5
comme vous avez utilisé des œuvres aussi. 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 pour 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 certains implémentation non standard cassée.
, Vous pouvez également essayer de nextBoolean()
-Méthode
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()
Quoi qu'il en soit, voici un exemple de code:
java.util.Random
Random random = new Random();
random.nextBoolean();
Pourquoi ne pas utiliser la Random
de la classe, qui possède une méthode nextBoolean
:
import java.util.Random;
/** Generate 10 random booleans. */
public final class MyProgram {
public static final void main(String... 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é au 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. Le cas échéant, l'utilisation de ThreadLocalRandom plutôt que d'objets aléatoires partagés dans les programmes simultanés rencontrera généralement beaucoup moins de surcharge et de contention.
java.util.concurrent.ThreadLocalRandom.current().nextBoolean();
Le moyen le plus simple d'initialiser un générateur de nombres aléatoires est d'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 vraiment des algorithmes qui génèrent une séquence de nombres fixe mais aléatoire.
Vous pouvez le rendre plus "aléatoire" en donnant au constructeur aléatoire le paramètre 'seed', que vous pouvez construire dynamiquement par exemple en utilisant temps système en millisecondes (qui sera toujours différent)
Vous pouvez obtenir votre valeur clock() et vérifier si elle est impaire ou pair. Je ne sais pas si c'est %50 de true
Et vous pouvez personnaliser votre fonction aléatoire:
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 veuillez ignorer cette icône skype: D
Vous pouvez également créer deux 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éclarer 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érer 2 entiers aléatoires.
int a = rand.nextInt(range);
int b = rand.nextInt(range);
Ensuite, il suffit de comparer retourner la valeur.
return a == b;
J'ai aussi une classe que vous pouvez utiliser. RandomRange.java
Générer un nombre aléatoire entier, INTEGER_RANDOM_NUMBER
Retour (INTEGER_RANDOM_NUMBER & 1)