首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成具有特定约束的随机位模式

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

Stack Overflow用户
提问于 2014-06-10 17:40:46
回答 2查看 99关注 0票数 0

我想生成一个0&1 (10000次迭代)的随机流,在这个约束下,1应该在400次迭代中只出现一次,有人能帮我解决一下它的C代码、C语言中要用到的库和函数吗?.Can

EN

回答 2

Stack Overflow用户

发布于 2014-06-10 17:45:19

400.0 * rand() / (RAND_MAX + 1.0) < 1 ? 1 : 0是一种方法。

如果你觉得很自信,并且表达式与左值类型匹配,就去掉三元组。注意400.01.0的小心放置。

(重要说明:如果您需要精确的1/ 400概率,则不要接受此解决方案。如果RAND_MAX是400的“非常差的倍数”,这个解决方案将不能很好地工作。假设标准要求RAND_MAX不低于32767,那么在这个低值下,该技术的统计特性将很差。)

票数 1
EN

Stack Overflow用户

发布于 2014-06-10 17:55:39

这里有一个解决方案,它提前从400的间隔中选择一个命中,如果轮到它就报告它;否则它会发出0。当报告命中时,将使用rand()确定下一个间隔的命中。函数使用static变量保持其状态,并使用特殊值-1来初始化自身:

代码语言:javascript
复制
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;
}

你可以这样称呼它:

代码语言:javascript
复制
for (i = 0; i < 10000; i++) {
    printf("%8d %d\n", i, next());
}

这与Bathsheba的解决方案不同,因为如果您的样本是400的倍数,它可以保证1:399的分布。这意味着它可能不是你要找的东西。

编辑我引入了一个新的函数pick,它在0(包含)和n (排除)之间选择一个随机数,它有望提供比模函数更好的分布。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24137713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档