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...

Author: aioobe, 2012-07-13

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.

 76
Author: aioobe, 2016-08-08 09:42:27

, Vous pouvez également essayer de nextBoolean()-Méthode

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

 25
Author: Sagi, 2012-07-13 10:02:51

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();
 16
Author: TheNewOne, 2012-07-13 10:04:14

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);
    }
  }
}
 2
Author: fanf, 2012-07-13 10:09:08

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();
 1
Author: wildloop, 2017-12-19 00:47:57

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)

 0
Author: PoeHaH, 2012-07-13 10:05:21

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

 0
Author: huseyin tugrul buyukisik, 2012-07-13 10:26:11

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

 -1
Author: Angel Fernandez, 2017-07-20 19:19:15
  • Générer un nombre aléatoire entier, INTEGER_RANDOM_NUMBER

  • Retour (INTEGER_RANDOM_NUMBER & 1)

 -2
Author: Rupak, 2012-07-13 10:28:12