web-dev-qa-db-fra.com

Problèmes pour générer un nombre Math.random, que ce soit ou 1

J'ai vu cette question posée à maintes reprises sur ce site Web et croyez-moi, j'en ai parcouru un grand nombre et beaucoup de vidéos YouTube et rien ne s'est avéré efficace pour moi. Comme le titre le dit, je veux un nombre aléatoire, 0 ou 1, puis ce sera retourné à main () comme dans mon code ci-dessous.

import Java.util.Scanner;
public class Exercise8Lab7 {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        int numFlips = 0;
        int heads = 0;
        int tails = 0;
        String answer;


        System.out.print("Please Enter The Number Of Coin Tosses You Want: ");
        numFlips = input.nextInt();

        for(int x = 1;x <= numFlips; x++){
            if(coinToss() == 1){
                answer = "Tails";
                tails++;
            }
            else{
                answer = "Heads";
                heads++;
            }
            System.out.print("\nCoin Toss " + x + ": " + answer);
        }
        System.out.println("\n\n====== Overall Results ======" +
        "\nPercentage Of Heads: " + (heads/numFlips)*100 + "\nPercentage Of Tails: " + (tails/numFlips)*100);
    }

    public static int coinToss(){
        double rAsFloat = 1 * (2 + Math.random( ) );
        int r = (int)rAsFloat;
        return r;
    }
}

De nombreuses solutions ont été suggérées pour utiliser l'option util.Random que j'ai faite et qui fonctionne parfaitement, mais je veux savoir pourquoi je n'arrive pas à le faire fonctionner. Évidemment, je veux que le nombre soit un int moi-même, donc je le convertis en int après la génération du nombre aléatoire. Mais peu importe ce que j'ajoute ou multiplie par Math.random (), ce sera toujours soit des têtes, soit des queues. Jamais mélangé.

Toute aide appréciée!

5
alannm37

Vous pouvez utiliser des valeurs booléennes de 0 ou 1 basées sur la valeur de Math.random() comme un double entre 0,0 et 1,0, ce qui simplifie beaucoup le générateur aléatoire. Et vous pouvez vous débarrasser complètement de la méthode coinToss().

if(Math.random() < 0.5) {
    answer = "Tails";
    tails++;
}

Supprimez la méthode de tirage au sort et remplacez la première condition par le code ci-dessus.

Math.random(); retournera par lui-même une valeur comprise entre 0.0 et moins de 1.0. Si la valeur est dans la moitié inférieure, [0.0, 0.5), alors elle a la même probabilité d'être dans la moitié supérieure, [0.5, 1.0). Par conséquent, vous pouvez définir n'importe quelle valeur de la moitié inférieure comme vraie et la valeur supérieure comme étant fausse.

13
user3591559

Essayez ceci) Il va générer un nombre 0 ou 1  

 Math.round( Math.random() )  ;
7
DzenDzimon

sa ne fonctionne pas à cause du nombre entier que vous utilisez, l'appel à 2+ Math.Random vous donne toujours une réponse entre 0.0 et 1.0.

en supposant que vous receviez 0,25 en tant que résultat, votre calcul est comme suit

double d = 1* (2 + 0.25); // (result = 2  

Ensuite, vous vérifiez si votre résultat == 1 (ce qui ne sera jamais le cas).

Un meilleur résultat serait de déclarer Java.util.Random en tant que variable de classe et d'appeler random.nextBoolean () et d'effectuer simplement le calcul de votre tête/queue sur cette base. 

Si vous deviez continuer à utiliser Math.random () et disons 

return Math.random() < 0.5

Vos résultats seraient un peu faussés du fait que Math.random () ne peut pas retourner 1.0, car la spécification de l'API Java indique: 

"Retourne une double valeur avec un signe positif, supérieur ou égal à 0.0 et inférieur à 1.0."

1
Damian Nikodem

Math.random() renvoie un float aléatoire dans la plage [0.0,1.0), ce qui signifie que le résultat peut être compris entre 0 et sans inclure 1.0.

Votre code

double rAsFloat = 1 * (2 + Math.random( ) );

prendra ce nombre dans la plage [0.0,1.0); ajouter 2 vous donne un nombre compris entre [2.0,3.0); le multiplier par 1 ne sert à rien; puis, lorsque vous le tronquez en un entier, le résultat est toujours 2.

Pour obtenir des entiers à partir de ce type de fonction aléatoire, vous devez déterminer combien d'entiers différents vous pouvez renvoyer, puis multipliez votre nombre aléatoire par celui-ci. Si vous voulez une réponse "0 ou 1", votre plage est composée de 2 entiers différents, multipliez donc Math.random() par 2:

double rAsFloat = 2 * Math.random();

Cela vous donne un nombre aléatoire compris dans l'intervalle [0.0,2.0), qui peut être égal à 0 ou 1 lorsque vous tronquez un entier avec (int). Si, au lieu de cela, vous vouliez quelque chose qui retourne 1 ou 2, par exemple, vous ajouteriez simplement 1:

double rAsFloat = 1 + 2 * Math.random();

Je pense que vous avez déjà compris que la classe Random vous donne ce que vous voulez beaucoup plus facilement. J'ai quand même décidé d'expliquer tout cela, car un jour, vous pourriez travailler sur un système existant dans une ancienne langue où vous avez vraiment besoin de travailler avec une valeur aléatoire [0.0,1.0). (OK, peut-être que ce n’est plus très probable, mais qui sait?)

1
ajb

(int) (Math.random () * 2) fonctionne également très bien dans ce cas

1
Kanak Lata

Bizarre que personne n'utilise une division modulo pour le nombre aléatoire. Ceci est l'implémentation la plus simple que vous puissiez obtenir:

Random Rand = new Random();
int randomValue = Rand.nextInt() % 2;
0
Pier Betos

Le problème peut être traduit en génération booléenne comme suit:

public static byte get0Or1 {

Random random = new Random();
boolean res=   random.nextBoolean();

if(res)return 1;
else return 0;

}
0
Java Main