【发布时间】:2015-11-02 03:51:39
【问题描述】:
我正在尝试在 C 中生成介于 0 和 1 之间的离散均匀分布。
通常您会期望: t = rand()%2 ,但这种方法似乎存在问题(它似乎与具有更多概率的较低位有关,尽管我对此不太了解)。
我尝试了一个在互联网上某处找到的技巧:
令 t1,t2 为 2 在 0 和 1 之间不那么均匀的分布,其中 1 的概率为 p,p 的概率为 (1-p)。然后我们取2个随机数:
t1 : p for 1, (1-p) for 0
t2 : p for 1, (1-p) for 0
如果 t1!=t2,我们有 (t1,t2)=(1,0) 和 (t1,t2) = (0,1) 相同的概率:p(1-p)。所以我们只是重复采样直到我们得到 t1!=t2 并且我们选择随机数 t = t1(这真的没关系)。这是我的代码:
#include <time.h>
#include <stdlib.h>
int main()
{
/*
Declare variable to hold seconds on clock.
*/
int i,t1,t2,t;
time_t seconds;
seconds = time(NULL);
/*
Get value from system clock and
place in seconds variable.
*/
time(&seconds);
/*
Convert seconds to a unsigned
integer.
*/
srand((unsigned int) seconds);
/*
Output random values.
*/
for (i =0; i < 10; ++i)
{
do
{
t1 = rand()%2;
t2 = rand()%2;
}
while (t1==t2);
t = t1;
printf("%d\n",t);
}
/*printf("%d",rand()%2);
printf("%d",rand()%2);*/
return 0;
}
我是对还是错?非常感谢!
【问题讨论】:
-
您将需要了解
rand的实际问题,以了解为什么这不可能工作(与分发无关),但基本上:不要使用@ 987654324@. -
rand()%2的一个简单替代方案是rand() > RAND_MAX / 2,它不会因最低位的低熵而受到偏差的影响。 -
所以“0 和 1 之间的离散均匀分布”是指概率为 1/2 的 0 和概率为 1/2 的 1?