【发布时间】:2014-05-28 03:31:31
【问题描述】:
在我们需要生成概率的情况下,例如具有 75% 的抛头和 25% 的抛尾的偏差硬币。按照惯例,我会这样做:
#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
int heads=0, tails=0;
srand(time(NULL));
number = rand() % 100 + 1; //Generate random number 1 to 100
if (number <= 75) //75% chance
heads++; //This is head
else
tails++; //This is tail
}
这是一个工作代码,但是当我在 SO 中为另一个用户回答类似的关于偏差硬币的问题时,一些用户提到了 100 的倍数。由于随机函数产生均匀分布,我觉得上面的代码足以模拟概率事件。
在过去的 SO 帖子中,用户 Bathsheba 提到了一些关于 100 的倍数的问题:Program that simulates a coin toss with a bias coin 我想知道与此相关的代码中可能存在哪些问题。
我的问题是:上面的代码是可以接受的代码来创建概率模拟吗?或者这些代码中是否有任何缺陷会影响模拟结果的准确性。如果上述代码存在缺陷,那么实现概率模拟的正确方法是什么?
编辑:进行了 10,000,000 次抛掷的模拟测试。它总是以大约 75.01%-75.07% 的概率产生抛头。那么当它产生一个看似准确的结果时会出现什么问题。 (生成的结果似乎没有偏差)
【问题讨论】:
-
“由于随机函数生成正态分布” - 不,它不会。它生成一个均匀分布...
-
%运算符扭曲了分布。 -
@MitchWheat 是的,我的意思是均匀分布,我将对此进行编辑。谢谢:-)
-
Bethsheba 对您链接到的问题的回答充分解释了为什么不赞成使用 %。
-
rand() 与模数结合存在已知缺陷,请勿用于任何重要的事情,例如证明。
标签: c++ algorithm math random probability