我想生成一个0&1 (10000次迭代)的随机流,在这个约束下,1应该在400次迭代中只出现一次,有人能帮我解决一下它的C代码、C语言中要用到的库和函数吗?.Can
发布于 2014-06-10 17:45:19
400.0 * rand() / (RAND_MAX + 1.0) < 1 ? 1 : 0是一种方法。
如果你觉得很自信,并且表达式与左值类型匹配,就去掉三元组。注意400.0和1.0的小心放置。
(重要说明:如果您需要精确的1/ 400概率,则不要接受此解决方案。如果RAND_MAX是400的“非常差的倍数”,这个解决方案将不能很好地工作。假设标准要求RAND_MAX不低于32767,那么在这个低值下,该技术的统计特性将很差。)
发布于 2014-06-10 17:55:39
这里有一个解决方案,它提前从400的间隔中选择一个命中,如果轮到它就报告它;否则它会发出0。当报告命中时,将使用rand()确定下一个间隔的命中。函数使用static变量保持其状态,并使用特殊值-1来初始化自身:
int pick(int n)
{
return 400 * rand() / ((double) RAND_MAX + 1);
}
int next()
{
static int hit = -1;
static int count;
if (hit < 0) hit = pick(WIDTH);
if (count++ == hit) {
hit = ((hit / WIDTH) + 1) * WIDTH + pick(WIDTH);
return 1;
}
return 0;
}你可以这样称呼它:
for (i = 0; i < 10000; i++) {
printf("%8d %d\n", i, next());
}这与Bathsheba的解决方案不同,因为如果您的样本是400的倍数,它可以保证1:399的分布。这意味着它可能不是你要找的东西。
编辑我引入了一个新的函数pick,它在0(包含)和n (排除)之间选择一个随机数,它有望提供比模函数更好的分布。
https://stackoverflow.com/questions/24137713
复制相似问题