Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 生成具有特定约束的随机位模式_C_Random - Fatal编程技术网

C 生成具有特定约束的随机位模式

C 生成具有特定约束的随机位模式,c,random,C,Random,我想生成一个0和1的随机流(10000次迭代),条件是1在400次迭代中只能出现一次。有谁能帮我了解一下它的C代码、库以及C中要使用的函数。400.0*rand()/(rand_MAX+1.0)

我想生成一个0和1的随机流(10000次迭代),条件是1在400次迭代中只能出现一次。有谁能帮我了解一下它的C代码、库以及C中要使用的函数。

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:不管怎么说,这可能被夸大了,但我接受了你的观点。还解释了此解决方案存在问题的原因。