0

私は 2 年生のソフトウェア エンジニアリングの学生なので、私のコードはアマチュアのように見えます。

私は宝くじ番号ジェネレーターを作成しましたが、独特ではあるが一貫した結果に気付きました。私のプログラムは、ユーロ ミリオンズ抽選の以前の宝くじ番号と一致させようとします。試行回数を追跡し、3、4、5、および 6 の数字と一致した回数も追跡します。

試行回数は 100 万回から 4 億 2,200 万回です。つまり、プログラムを 10 回実行して範囲を達成し、各実行にかかる時間も追跡します。

乱数が複数回使用されるのを防ぐなど、多くのことを説明します。このチェックは、可能な宝くじ番号の HashMap に対して行われます。ハッシュマップ内に乱数が見つかった場合は、その数値を配列リストに追加してから、その数値をハッシュマップから削除します。

私の質問は結果に関連しています。

宝くじの数字を一致させようとするすべての試みで、3 つの数字が当たる確率は平均 3.13% でした。4 つの数値では 0.28%、5 つの数値では 0.00012%、6 つの数値では 0.00022% に低下しました。

当然のことながら、宝くじの数が増えるにつれて当選確率は低下しますが、100 万回でも 1 億回でも当選確率は同じか、非常に近いものでした。

私の最小試行回数は 1,088,157 回で、約 6 秒または 6612ms かかりました。

最大の試行回数は 422,036,905 回で、26 分または 1589867 ミリ秒かかりました。

私はJava Randomライブラリを使用しているので、これについて明確にしたいだけです。それとも、単純に確率に当てはめる必要がありますか?

私のコードは不要な 225 行です。特定の部分を見たい場合、または全体を見たい場合は、これをリクエストしてください。以下は、最初の 5 つの数値の乱数生成のサンプルです。

//stores all possible lottery numbers
public static  HashMap<Integer,Integer> randRange = new HashMap<Integer,Integer>();

//stores bonus ball numbers
public static  HashMap<Integer,Integer> boRange = new HashMap<Integer,Integer>();

//stores lottery number output
public static  ArrayList<Integer> lotNum = new  ArrayList<Integer>();

//stores bonus ball output
public static  ArrayList<Integer> boNum = new  ArrayList<Integer>();

public static void randomInt(){

    Random rand = new Random();

    //generate a random number
    int RandInt = rand.nextInt(51);
    int boInt = rand.nextInt(12);

    //loop used to get unique random number
    int count=0;
    while(count!=5){

        //check if random number exists
        if(randRange.get(RandInt)!=null)
        {
            //finalise random number
            RandInt=randRange.get(RandInt);

            //add to ArrayList
            lotNum.add(RandInt);

            //remove number
            //ensures next random number is unique
            randRange.remove(RandInt);

            count++;                
        }

        else
        {
            //get a new random number 
            //and start process again
            RandInt = rand.nextInt(51);
        }
    }
}

編集:

まず、評判が 15 未満であるため、賛成できませんでした。コメントを含め、すべての回答が役に立ちました。

すべてのメンバーからの提案のおかげで、プログラムを改善し、当然のことながらコードに欠陥があることを発見しました。@digitaljoel 5 と 6 の数字が一致する確率は正しかった。計算を間違って設定しました。たとえば、数字 11,20 30,35,45,2,3 の場合、ユーロミリオンズの抽選は 3 で 0.7%、4 で .05%、5 で .00273%、6 で .000076 でした。 %。

@maybewecouldstealavan のおかげで、シャッフル メソッドを単純に ArrayList に入力してリストをシャッフルし、最初の 5 つの数字を取得して、ボーナス ボールに対して同じことを行うように変更しました。利点は、1 秒あたりのチェック数が 15 万から 20 万チェックから 25 万から 70 万チェックに増加したことです。

@trutheality に感謝します。場合によっては、1000 または 1,000,000 の一致をチェックした場合、バリエーションが類似または分でした。

@LeviX可能な組み合わせの計算をもう一度感謝します。プログラム内でこれを使用したところ、宝くじに当選するのに組み合わせの総数よりも多くの数が必要であることがわかりました。ほとんどの場合、重複した乱数を生成しています。これから、おそらくすべての可能な組み合わせを作成し、プログラムが一致するまで各組み合わせをランダムに選択します。

4

3 に答える 3

4

宝くじの数字を一致させようとするすべての試みで、3 つの数字が当たる確率は平均 3.13% でした。4 つの数値では 0.28%、5 つの数値では 0.00012%、6 つの数値では 0.00022% に低下しました。

当然のことながら、宝くじの数が増えるにつれて当選確率は低下しますが、100 万回の試行でも 1 億回の試行でも、比率は同じか、非常に近いものでした。

それは実際にはまったく驚くべきことではありません。ここで最終的に行うことは、3、4、5、または 6 つの数字を正しく推測する確率を推定することです。より多くのサンプルを使用すると、推定の変動が小さくなるだけですが、100 万個の「わずかな」サンプルであっても、推定は正確な確率 (数学を行うことで計算できます) に近いと予想されます。

于 2012-04-11T21:47:00.573 に答える
0

勝つ回数の割合がより「ランダム」になることを期待しているということですか? それがあなたが得ているものなら、@truthreality はかなり正しいです。さらに読むには、大数の法則中心極限定理を参照してください。

シャッフルの方法が正しいかどうかを尋ねている場合、それは非効率的ですが. 重複が発生したときにチェックしているだけで、ボールを選んだ後に新しい乱数を作成していないため、必要以上の乱数を生成しているため、少なくとも 1 つの HashMap.get が必要です。 (int) ピックごと。

代わりに、次のいずれかの方法を使用できます。

1) すべてのボール値を含む ArrayList を作成します。描画ごとCollections.shuffle(yourArrList, rand)に、それらのクローンをシャッフルするために使用し、リストから最初の 5 つのボールだけを使用します。

2) 再び、ボール値の Array または ArrayList を作成します。次に、シャッフル操作の一部を自分で実装します。可能性のより小さなサブセットから選択し、選択した要素の場所に収まらなくなった要素を交換します。利点は、配列全体をシャッフルする必要がないことです。これが私の迅速で汚い実装です:

public static int[] choose(int[] array, int count, Random rand) {
    int[] ar = array.clone();
    int[] out = new int[count];
    int max = ar.length;
    for (int i = 0; i<count; i++) {
        int r = rand.nextInt(max); 
        //max is decremented, 
        //the selected value is copied out then overwritten 
        //by the last value, which would no longer be accessible
        max--;
        out[i]=ar[r];
        ar[r]=ar[max];
    }
    return out;
}

特に順序が重要でない場合は、おそらく改善の余地があります。

于 2012-04-11T23:36:39.667 に答える
0

私の理解では、ユーロ ミリオンズには 2 つの異なる部分があります。5 ボールと 2 ボーナス ボール。正確な勝利確率を計算することで、プログラムの計算を確認できます。ググればわかると思いますが、簡単に計算できます。

50個中5個出る確率(順番は問いません)

P(A) = 50!/5!(50-5)! = 2,118,760

11個中2個出る確率(順番は問いません)

P(B) 11!/2!(11-2)! = 55

2 つのイベントは独立しているので、それらを乗算します。

P(A) * P(B) = P(A&B)
2,118,760 * 55 = 116,531,800

したがって、宝くじに当選する確率は次のとおりです。

1 in 116,531,800
于 2012-04-11T22:15:18.290 に答える