web-dev-qa-db-fra.com

Renvoie Vrai ou Faux au hasard

J'ai besoin de créer une méthode Java pour renvoyer true ou false de façon aléatoire. Comment puis-je faire ceci?

60
Bishan

La classe Java.util.Random a déjà cette fonctionnalité:

public boolean getRandomBoolean() {
    Random random = new Random();
    return random.nextBoolean();
}

Cependant, il n'est pas efficace de toujours créer une nouvelle instance Random à chaque fois que vous avez besoin d'un booléen aléatoire. Créez plutôt un attribut de type Random dans votre classe qui a besoin du booléen aléatoire, puis utilisez cette instance pour chaque nouveau booléen aléatoire:

public class YourClass {

    /* Oher stuff here */

    private Random random;

    public YourClass() {
        // ...
        random = new Random();
    }

    public boolean getRandomBoolean() {
        return random.nextBoolean();
    }

    /* More stuff here */

}
104
buc

(Math.random() < 0.5) renvoie vrai ou faux au hasard

55
Hachi

Cela devrait faire:

public boolean randomBoolean(){
    return Math.random() < 0.5;
}
14
Michael Borgwardt

Vous pouvez faire comme code suivant,

public class RandomBoolean {
    Random random = new Random();
    public boolean getBoolean() {
        return random.nextBoolean();
    }
    public static void main(String[] args) {
        RandomBoolean randomBoolean = new RandomBoolean();
        for (int i = 0; i < 10; i++) {
            System.out.println(randomBoolean.getBoolean());
        }
    }
}

J'espère que cela vous aiderait, merci.

5
Ahamed

Vous l'obtiendrez par ceci:

return Math.random() < 0.5;
2
Amit Pathak

Vous pouvez utiliser les éléments suivants pour obtenir un résultat non biaisé:

Random random = new Random();
//For 50% chance of true
boolean chance50oftrue = (random.nextInt(2) == 0) ? true : false;

Remarque: random.nextInt (2) signifie que le nombre 2 est la limite. le comptage commence à 0. Nous avons donc 2 nombres possibles (0 et 1) et la probabilité est donc de 50%!

Si vous voulez donner plus de probabilité à votre résultat d'être vrai (ou faux), vous pouvez ajuster ce qui précède comme suit!

Random random = new Random();

//For 50% chance of true
boolean chance50oftrue = (random.nextInt(2) == 0) ? true : false;

//For 25% chance of true
boolean chance25oftrue = (random.nextInt(4) == 0) ? true : false;

//For 40% chance of true
boolean chance40oftrue = (random.nextInt(5) < 2) ? true : false;
0
christouandr7

La classe Random de Java utilise l'horloge interne du processeur (pour autant que je sache). De même, on peut utiliser RAM des informations comme source d’aléatoire. Ouvrez simplement le Gestionnaire des tâches de Windows, l’onglet Performances, et jetez un coup d’œil à Mémoire physique - Disponible: elle change continuellement; la plupart du temps , la valeur est mise à jour toutes les secondes environ, mais dans de rares cas, la valeur reste constante pendant quelques secondes. Les autres valeurs qui changent encore plus souvent sont les poignées système et les threads, mais je n’ai pas trouvé le cmd commande pour obtenir leur valeur, donc dans cet exemple, j'utiliserai le Mémoire physique disponible comme source de caractère aléatoire.

import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStreamReader;

public class Main {

    public String getAvailablePhysicalMemoryAsString() throws IOException
    {
        Process p = Runtime.getRuntime().exec("cmd /C systeminfo | find \"Available Physical Memory\"");
        BufferedReader in = 
                new BufferedReader(new InputStreamReader(p.getInputStream()));
        return in.readLine();
    }

    public int getAvailablePhysicalMemoryValue() throws IOException
    {
        String text = getAvailablePhysicalMemoryAsString();
        int begin = text.indexOf(":")+1;
        int end = text.lastIndexOf("MB");
        String value = text.substring(begin, end).trim();

        int intValue = Integer.parseInt(value);
        System.out.println("available physical memory in MB = "+intValue);
        return intValue;
    }

    public boolean getRandomBoolean() throws IOException
    {
        int randomInt = getAvailablePhysicalMemoryValue();
        return (randomInt%2==1);
    }


    public static void main(String args[]) throws IOException
    {       
        Main m = new Main();
        while(true)
        {
            System.out.println(m.getRandomBoolean());
        }
    }
}

Comme vous pouvez le constater, la partie principale exécute la commande cmd systeminfo avec Runtime.getRuntime().exec().

Par souci de brièveté, j'ai omis les déclarations try-catch. J'ai exécuté ce programme plusieurs fois et aucune erreur ne s'est produite - il y a toujours une ligne "Mémoire physique disponible" dans le résultat de la commande cmd.

Inconvénients possibles:

  1. Il y a un certain retard dans l'exécution de ce programme. Veuillez noter que dans la fonction main(), à l'intérieur de la boucle while(true), il n'y a pas de Thread.sleep() et que, malgré tout, la sortie est imprimée sur la console environ une fois par seconde environ.
  2. La mémoire disponible peut être constante pour une session de système d'exploitation récemment ouverte - veuillez vérifier. Je n'ai que quelques programmes en cours d'exécution et la valeur change à peu près toutes les secondes. J'imagine que si vous exécutez ce programme dans un environnement serveur, il ne devrait pas y avoir de problème pour obtenir une valeur différente pour chaque appel.
0
wile the coyote