我的代码看起来很业余,因为我是一名软件工程专业的二年级学生。
我创建了一个彩票号码生成器,并注意到了奇怪但一致的结果。我的程序试图匹配之前的百万欧元抽奖彩票号码。我追踪尝试次数,也追踪匹配3、4、5和6个数字的次数。
尝试次数在100万到4.22亿之间。i、 e.我会运行程序10次,我会实现一个范围,我还会跟踪每次运行所需的时间长度。
我解释了一些事情,比如防止一个随机数被多次使用,这个检查是针对可能的彩票号码的哈希图进行的。如果我在hashmap中找到随机数,我会将该数添加到arraylist中,然后从hashmap中删除该数。
我的问题围绕着结果。
在所有匹配彩票号码的尝试中,我得到3个号码的几率平均为3.13%。4个数字下降到0.28%,5个数字下降到0.00012%,6个数字下降到0.00022%。
可以理解的是,随着彩票号码的增加,中奖的几率会降低,但是无论我尝试了100万次还是1亿次,这个比例都是相同的,或者非常接近。
如果你感兴趣,我最小的尝试次数是1,088,157次,大约需要6秒或6612毫秒。
尝试次数最多的是422036905次,耗时26分钟或1589867毫秒。
因为我使用的是Java随机库,所以我只是想弄清楚这一点。还是我应该简单地把它归结为概率?
我的代码是不必要的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为0.7%,4为0.05%,5为0.00273%,6为0.000076%。
多亏了@maybewecouldstealavan,我改变了我的洗牌方法,只需填充一个ArrayList并洗牌列表,获得前五个数字,并对奖金球执行同样的操作。好处在于每秒的检查次数从每秒15-20万次增加到每秒25-70万次。
由于@trutheality,在某些情况下,如果我检查1000或1000000个匹配项,则变化相似或很小。
@LeviX再次感谢对可能组合的计算。我在程序中使用了这一点,发现中奖所需的时间超过了组合总数。很可能我产生了重复的随机数。根据这个,我可能会创建所有可能的组合,并随机选择每个组合,直到程序找到匹配项。
据我所知,百万欧元有两个不同的部分。5个球,然后是2个奖金球。你可以通过计算准确的获胜概率来检查你的程序的数学性。我相信你可以用谷歌搜索,但这很容易计算。
50个球中有5个球的概率(顺序无关紧要)
P(A) = 50!/5!(50-5)! = 2,118,760
11个球中得到2个球的概率(顺序不重要)
P(B) 11!/2!(11-2)! = 55
这两个事件是独立的,所以将它们相乘。
P(A) * P(B) = P(A&B)
2,118,760 * 55 = 116,531,800
因此,中彩票的几率是:
1 in 116,531,800
你的意思是说你希望你赢的次数比例更“随机”吗?如果这就是你的意思,那么@truthreality是非常正确的。为了进一步阅读,你可以看看大数定律和中心极限定理。
如果你问你的洗牌方法是否正确,尽管效率很低。你生成的随机数比需要的要多,因为你只是在重复发生时检查它们,而且在你拾取一个球后你不会创建一个新的随机数,所以你需要至少一个HashMap。每次拾取获取(int)。
我可能会使用以下方法之一:
1) 创建一个包含所有球值的ArrayList。对于每个图形,使用集合。shuffle(yourarlist,rand)要洗牌它的克隆,只需使用列表中的前5个球即可。
2) 同样,创建球值的数组或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;
}
可能还有改进的余地,尤其是如果顺序无关紧要的话。
在所有匹配彩票号码的尝试中,我得到3个号码的几率平均为3.13%。4个数字下降到0.28%,5个数字下降到0.00012%,6个数字下降到0.00022%。
可以理解的是,随着彩票号码的增加,中奖的几率会降低,但是无论我尝试了100万次还是1亿次,这个比例都是相同的,或者非常接近。
那其实一点也不奇怪。你在这里最终要做的是估算正确猜测3,4,5或6个数字的概率。拥有更多的样本只会让你估算中的变化更小,但即使“少”到100万样本,你的估算也有望接近确切的概率(你可以通过做一些数学计算)。
在 Java 中要生成一个指定范围之内的随机数字有两种方法:一种是调用 Math 类的 random() 方法,一种是使用 Random 类。 Random 类提供了丰富的随机数生成方法,可以产生 boolean、int、long、float、byte 数组以及 double 类型的随机数,这是它与 random() 方法最大的不同之处。random() 方法只能产生 double 类型的 0~1
生成随机数 # random_random.py import random for i in range(5): print('%04.3f' % random.random(), end=' ') print() # random_uniform.py import random for i in range(5): print('{:04.3f}'.format(ran
random 生成随机数包 文档:https://www.npmjs.com/package/random 安装:npm install --save random 封装代码: app / extend / context.js // 导入 jwt const jwt = require('jsonwebtoken') // 导入随机数包 const random = require('rando
问题 你需要生成在一定范围内的随机数。 解决方案 使用 JavaScript 的 Math.random() 来获得浮点数,满足 0<=X<1.0 。使用乘法和 Math.floor 得到在一定范围内的数字。 probability = Math.random() 0.0 <= probability < 1.0 # => true # 注意百分位数不会达到 100。从 0 到 100 的范围实
问题内容: JavaScript函数返回一个介于0到1之间的随机值,该值会根据当前时间自动播种(我相信类似于Java)。但是,我认为没有任何办法可以为其设置种子。 如何制作一个可以提供自己的种子值的随机数生成器,以使它生成可重复的(伪)随机数序列? 问题答案: 一种选择是http://davidbau.com/seedrandom,它是可播种的基于RC4的Math.random()插入式替换,具有
我正在寻找一个随机数生成器,我可以创建一个种子,并采取两个输入x和y来生成数字。每次使用相同的输入和相同的种子时,我都需要相同的数字。 我正在使用这个来随机分配一个坐标网格上的纹理,所以我需要它每次都是一样的。所以每次我在x=100,y=120的时候,在同一个种子里,我需要相同的随机数,所以相同的纹理被分配在那个点上。