我的代码看起来很业余,因为我是二年级的软件工程专业学生。
我创建了一个彩票号码生成器,并注意到了奇特但一致的结果。我的程序试图匹配之前的欧洲百万彩票开奖号码。我跟踪它所花费的尝试次数,我还跟踪我匹配 3、4、5 和 6 个数字的次数。
尝试的范围在 100 万到 4.22 亿之间。即我会运行程序 10 次,我会达到一个范围,我还会跟踪每次运行所花费的时间长度。
我考虑了许多事情,例如防止随机数被多次使用,并且此检查是针对可能的彩票号码的 HashMap 进行的。如果我在哈希图中找到随机数,我将其添加到数组列表中,然后从哈希图中删除该数字。
我的问题围绕着结果。
在所有匹配彩票号码的尝试中,我获得 3 个号码的机会平均为 3.13%。4 个数字下降到 0.28%,5 个数字下降到 0.00012%,6 个数字下降到 0.00022%。
可以理解,随着彩票号码数量的增加,中奖的机会将会减少,但是无论我有 100 万次还是 1 亿次尝试,这个比率都相同或非常接近。
如果您有兴趣,我的最小尝试次数是 1,088,157,大约需要 6 秒或 6612 毫秒。
最大尝试次数为 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 是 0.05%,5 是 0.00273%,6 是 0.000076 %。
感谢@maybewecouldstealavan,我改变了我的洗牌方法,简单地填充一个 ArrayList 并洗牌列表,获取前五个数字并对奖金球做同样的事情。好处是每秒检查的数量从每秒 150-20 万次检查增加到每秒 250-70 万次检查。
感谢@trutheality,因为在某些情况下,如果我检查了 1000 或 1,000,000 个匹配项,则变化是相似的或微小的。
@LeviX 再次感谢可能组合的计算。我在程序中使用了这个,发现赢得彩票所花费的时间超过了组合的总数。我很可能会产生重复的随机数。由此我可能会创建所有可能的组合并随机选择每个组合,直到程序找到匹配项。