生成具有某些约束的随机位模式

时间:2014-06-10 09:40:46

标签: c random

我想生成一个0& s的随机流。 1#(10000次迭代)约束条件下1应该只发生400次迭代中的一次。任何人都可以帮助我解决它的C代码以及库中使用的库和函数。

2 个答案:

答案 0 :(得分:1)

400.0 * rand() / (RAND_MAX + 1.0) < 1 ? 1 : 0是单向的。

如果你感到自信并且表达式与左值类型匹配,则删除三元组。请注意谨慎放置400.01.0

重要提示:如果您需要准确的1/4概率,请不要接受此解决方案。如果RAND_MAX是&#34;非常差的多个&#,此解决方案将无法正常工作鉴于标准要求RAND_MAX不低于32767,在该低值时,该技术的统计特性将很差。)

答案 1 :(得分:1)

这是一个解决方案,提前选出一个400的间隔,并报告轮到它;否则它会发出0.当报告命中时,下一个间隔的命中将由rand()确定。 functon使用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(独占)之间的随机数,这有望提供比模数函数。