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