C 生成具有特定约束的随机位模式
我想生成一个0和1的随机流(10000次迭代),条件是1在400次迭代中只能出现一次。有谁能帮我了解一下它的C代码、库以及C中要使用的函数。C 生成具有特定约束的随机位模式,c,random,C,Random,我想生成一个0和1的随机流(10000次迭代),条件是1在400次迭代中只能出现一次。有谁能帮我了解一下它的C代码、库以及C中要使用的函数。400.0*rand()/(rand_MAX+1.0)
400.0*rand()/(rand_MAX+1.0)<1?1:0
是一种方式
如果您感到自信并且表达式与左值类型匹配,请删除三元表达式。注意400.0
和1.0
的小心放置
(重要提示:如果您需要精确的1/400概率,请不要接受此解决方案。如果RAND_MAX是400的“非常差的倍数”,此解决方案将无法正常工作。鉴于标准要求RAND_MAX不低于32767,在该低值下,此技术的统计特性将很差。)这里有一个解决方案,它可以从400次间隔中提前选择一次命中,并在轮到它时报告它;否则它将发出0。报告命中时,下一个间隔的命中由
rand()
确定。函数使用静态变量保持其状态,并使用特殊值-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;
}
int-pick(int-n)
{
返回400*rand()/((双)rand_MAX+1);
}
int next()
{
静态int hit=-1;
静态整数计数;
如果(命中<0)命中=拾取(宽度);
如果(计数+==命中){
命中=((命中/宽度)+1)*宽度+拾取(宽度);
返回1;
}
返回0;
}
你这样称呼它:
for (i = 0; i < 10000; i++) {
printf("%8d %d\n", i, next());
}
(i=0;i<10000;i++)的{
printf(“%8d%d\n”,i,next());
}
这与芭丝谢芭的溶液不同,因为如果你的样本是400的倍数,它保证了1:399的分布。这意味着它可能不是你想要的
Edit我引入了一个新函数pick
,它选择0(includev)和n(exclusive)之间的随机数,希望它提供比模函数更好的分布。我添加了随机标记。对于这种不对称的伯努利分布,可能有比我更好的方法可以提供更好的统计特性。您希望0
的出现频率恰好是1
的399倍,还是希望0
的概率是得到1
的概率的399倍?否否否否否否兰德()%N是这个世界上许多问题的原因!如果生成器的周期不是N的倍数,则会引入统计偏差;-)虽然我不喜欢在导弹制导系统的任何地方看到rand()%
。@Bathsheba:不管怎么说,这可能被夸大了,但我接受了你的观点。还解释了此解决方案存在问题的原因。