0

(注:似たような問題がいくつかありますが、正確な重複は見つかりませんでした)

質問

コインを任意の回数投げることを考えてみましょう。裏が 3 回出る前に表が 2 回出る確率は?

コード

これをシミュレートするために、10000000 回の試行を設定しました。ここで、0 は表、1 は裏などです。

    ArrayList<Integer> listOfTosses=new ArrayList<Integer>();
    int numTrue=0;
    int numTrials=0;

    while(numTrials<10000000)
    {
       boolean record=false;
       boolean twoHeads=false;
       int counter=2;

         listOfTosses.add((int) Math.random()*2);
         listOfTosses.add((int) Math.random()*2);

        if(listOfTosses.get(0)==0 && listOfTosses.get(1)==0)
        {
            twoHeads=true;
            record=true;
        }

        listOfTosses.add((int) Math.random()*2);

       while(record=false)
       {

          if(listOfTosses.get(counter)==0 && listOfTosses.get(counter-1)==0)
          {
            twoHeads=true;
            record=true;
          }
          if(listOfTosses.get(counter)==1 
          && listOfTosses.get(counter-1)==1
          && listOfTosses.get(counter-2)==1)                   
         {
            twoHeads=false;
            record=true;
         }
           listOfTosses.add((int) Math.random()*2);
           counter++;
      }




       if(twoHeads==true)
       {
           numTrue++;
       }


       record=false;
       twoHeads=false;
       listOfTosses.clear();

       numTrials++;

    }
    System.out.print(numTrue/10000000.0);

問題

コードは適切にコンパイルされますが、常に 1.0 という答えが返されます (正確な答えが 0.7 であることは数学的に証明できます)。

4

1 に答える 1

1

1 つのタイプミス: に変更while(record=false)while(record==false)ます。

その上、実行されていないwhile間に実行されるループrecord == false。これは、listOfTosses.get(0)listOfTosses.get(1)が両方とも 0 に設定されているためです。

を実行するとlistOfTosses.add((int) Math.random()*2);、実際には と同等listOfTosses.add(((int) Math.random()) * 2);です。以来Math.random() < 1、それは 0 に変わりlistOfTosses.add((int) (Math.random()*2));ます。代わりに実行してください。

または、float を変換する代わりに、java.util.Randomクラスを検討してください。関数は必要なもののnextInt(int n)ように見えます。

于 2014-03-31T02:42:30.800 に答える