【发布时间】:2015-08-15 10:43:59
【问题描述】:
我不认为这是重复的,因为我尝试了其他 SO 答案,但它们对我不起作用。当我运行一个程序(随时间播种)时,我得到一堆随机数。几秒钟后,我再次运行程序,得到了一堆类似的随机数。
srand(time(0));
for(int i=0; i<10; i++) {
cout<<rand()<<"\n";
}
8603 55 3146 26251 14799 16799 28230 314 3602 9504
8639 19984 3044 28803 29955 27225 29699 882 21389 7411
如您所见,数字不同,但非常相似。这对我不起作用的原因是因为我将它转换为 0 和 1 之间的浮点数(除以 RAND_MAX)。当我这样做时,以秒为单位的时间非常缓慢。在一次运行中,我可以拥有 0.09245... ,接下来我可以拥有 0.0925... 。我正在使用这些概率来制作二十一点 AI,并且我不希望相同的投注模式出现在随后的执行中。
我看了很多遍,并试图将种子放入循环中,但只是打印了 10 次相同的数字。不知道如何使数字在执行时看起来完全随机。感谢您的想法
编辑:
使用
srand(rd());
for(int i=0; i<10; i++) {
cout<<generate()<<"\n";
}
14514284786278117030 4620546740167642908 13109570281517897720 17462938647148434322 355488278567739596 7469126240319926998 4635995468481642529 418970542659199878 9604170989252516556 6358044926049913402
我认为每次运行时我都会得到完全相同的序列。
编辑 2:
一点背景知识以消除混乱。我希望分布均匀,但如果不是这样也没关系,这只是我自己的做法,没有赌场业务。我最初的计划是让 6 个字符有一个值为 12-20 的命中/停留概率数组。因此,就像吉姆一样,[0.958367, 0.942123, 0.876655, 0.864322, 0.7543321, 0.653213, 0.201201, 0.12919, 0.00001] 将这些数字组合起来。假设 Jim 有一手 14 点。所以我得到一个随机的 0-1 数字,如果它小于 0.876655,那么他会击中。 100轮后的优胜者将混合他们的“基因”,也许在1000轮后,自然会选出完美的孩子,并形成完美的命中/传球比。这就是我注意到 Pam 或其他人总是会击中的原因:他们的随机生成总是下降到 0.05 左右,所以无论她的手有多好或多坏,她都会击中。我几乎完成了,唯一的事情是修复这个随机生成器和另一个处理投注钱的小错误(我保证不相关)
【问题讨论】:
-
对不起,意思是类似的。我的错,不想骗你会编辑
-
代码没有问题,您看到的相似之处并不存在或只是巧合。
-
srand ()和random ()在这一点上实际上是玩具,委员会甚至可能会弃用它们。C++11使用std::uniform_*distribution有更好的支持。见:stackoverflow.com/questions/19665818/… -
我建议你研究一下引擎和发行版。
-
如果它们是随机的,谁在乎它们是什么?随机就是随机。如前所述,rand 不是最好的,并且使用除以最大值也是有偏差的,但结果仍然应该是用眼球测试“检测不到”的。随机就是随机。生成许多序列并绘制分布图以查看是否(以及在何种程度上)存在问题;不要依赖眼球联想来争论这种或另一种方式。