【发布时间】:2012-04-18 23:03:27
【问题描述】:
我想找到一种在 C 中获取随机数的不偏不倚的方法(尽管我最多将它用于 0-20 的值,更可能只用于 0-8)。我看过这个公式,但是在运行了一些测试之后,我不确定它是否有偏差。有什么帮助吗?
这是使用的完整功能:
int randNum()
{
return 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
}
我使用以下方法播种:
unsigned int iseed = (unsigned int)time(NULL);
srand (iseed);
我尝试过下面建议的那个拒绝为我工作
int greek;
for (j=0; j<50000; j++)
{
greek =rand_lim(5);
printf("%d, " greek);
greek =(int) (NUM * (rand() / (RAND_MAX + 1.0)));
int togo=number[greek];
number[greek]=togo+1;
}
当我注释掉 printf 时,它停止工作并给我同样的数字 50000 次。
【问题讨论】:
-
不应该
RAND_MAX + 1.0只是RAND_MAX? -
@EdHeal,如果您希望间隔为
[0.0,1.0)(即不包括 1.0),则必须除以 RAND_MAX 以上,尽管我认为小于1.0的值会更好。 -
@MarkRansom - 我知道。该问题要求 0-20 范围内的值。所以公式只需要除以 RAND_MAX,因为它没有提到范围不排除 20。
-
@EdHeal,如果您乘以 20.999999999999 而不是 20,您的方法将起作用。否则输出 20 的几率是 1/RAND_MAX,这与您可以得到的偏差差不多。
-
当然它总是给你相同的值,因为你一直调用未显示的 rand_lim(5),而不是 rand()。