web-dev-qa-db-ja.com

Math.random番号の生成に関する問題、0または1

私はこの質問をこのWebサイトに何度も投稿しているのを見たことがありますが、私はそれらの多くと非常に多くのYouTubeビデオを調べた結果、何も役に立たなかったと思います。タイトルにあるように、0または1のいずれかの乱数が必要であり、それが以下のコードのようにmain()に返されます。

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;
    }
}

多くの解決策が、私が行って完全に機能するutil.Randomオプションを使用するよう提案されていましたが、これを機能させることができない理由を整理したいと思います。明らかに、私はその数値を自分自身でintにしたいので、乱数が生成された後でそれをintに変換します。しかし、私がMath.random()を何を追加または乗算しても、常にすべてが頭であるか、すべてが尾であるかのいずれかになります。決して混ぜないでください。

助けてくれてありがとう!

6
alannm37

Math.random()の値に基づいて0または1のブール値を0.0と1.0の間のdoubleとして使用し、ランダムジェネレーターをはるかに単純にすることができます。そして、coinToss()メソッドを完全に取り除くことができます。

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

コイントスメソッドを削除し、最初の条件を上記のコードに置き換えます。

Math.random();自体は、0.0から1.0未満の値を返します。値が下半分[0.0、0.5)にある場合、上半分[0.5、1.0)と同じ確率です。したがって、下半分の任意の値をtrue、上半分をfalseに設定できます。

14
user3591559

これを試してください)または1が生成されます

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

Math.round(Math.random())は0.0および1.0を返します。これらの値はどちらもintの範囲の制限内にあるため、intにキャストできます。

public static int coinToss(){
    return (int)Math.round(Math.random());
}
2
balaji

使用している整数演算のために機能しません。2+Math.Randomへの呼び出しは、ほぼ常に0.0と1.0の間の答えを与えます。

結果として0.25を受け取ると仮定すると、あなたの数学は次のようになります

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

次に、結果が== 1かどうかを確認しています(これは決して行われません)。

より良い結果は、Java.util.Randomをクラス変数として宣言し、random.nextBoolean()を呼び出し、単純に頭/尾の計算を実行することです。

Math.random()を使い続けて、

return Math.random() < 0.5

Java API仕様に次のように記載されているため、Math.random()が1.0を返せないため、結果はわずかに歪んでしまいます。

「正の符号が付いた、0.0以上1.0未満のdouble値を返します。」

1
Damian Nikodem

Math.random()は、[0.0,1.0)の範囲のランダムな浮動小数点数を返します。つまり、結果は0からただし、含まない 1.0までの任意の値になる可能性があります。

あなたのコード

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

この数値は[0.0,1.0)の範囲で取得されます。 2を追加すると、[2.0,3.0)の範囲の数値が得られます。 1を掛けても、何の役にも立ちません。次に、整数に切り捨てると、結果は常に2になります。

この種のランダム関数から整数を取得するには、返される可能性のある整数の数を計算し、乱数に乗算する必要があります。 「0または1」の回答が必要な場合、範囲は2つの異なる整数であるため、Math.random()に2を掛けます。

_double rAsFloat = 2 * Math.random();
_

これにより、[0.0,2.0)の範囲の乱数が得られ、_(int)_で整数に切り捨てると、0または1になる可能性があります。代わりに、たとえば1または2を返すものが必要な場合は、それに1を追加するだけです。

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

Randomクラスを使用すると、必要なものがはるかに簡単に得られることをすでに理解していると思います。いずれにせよ、これをすべて説明することにしました。いつか、古い言語のレガシーシステムで実際に[0.0,1.0)ランダム値を処理する必要がある場合があるためです。 (OK、多分それはあまりありそうにないかもしれませんが、誰が知っていますか。)

1
ajb

(int)(Math.random()* 2)もこの場合正常に動作します

1
Kanak Lata

奇妙なことに、乱数にモジュロ除算を使用していない。これは、取得できる最も単純な実装です。

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

この問題は、ブール生成に次のように変換できます。

public static byte get0Or1 {

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

if(res)return 1;
else return 0;

}
0
Java Main