2014-06-10 52 views
0

我想生成一个0的随机流& 1(10000次迭代)约束条件下1应该只发生在400次迭代中的任何一次。可以帮助我的人用它的C代码以及在C中使用的库和函数。若要生成具有一定约束的随机位模式

+0

我已经添加了随机标签。可能有比我更好的方法,可以为这种不对称的伯努利分布提供更好的统计特性。 – Bathsheba

+0

你想'0'发生的次数是'1'的399倍吗?或者你想'0'的概率是获得'1'的概率的399倍? – bitmask

回答

1

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

如果您感到自信并且表达式与左值类型匹配,则删除三元组。请注意仔细安置400.01.0

重要提示:如果你在400的概率需要一种精确的1不接受这个解决方案该解决方案将无法正常工作,如果RAND_MAX是400一个“非常差多个”鉴于该标准规定RAND_MAX不低于32767,在这个低值下,这种技术的统计特性将会很差。)

+0

['rand()'认为有害](http://www.youtube.com/watch?v=LDPMpc-ENqY)也解释了为什么此解决方案存在问题。 – bitmask

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()); 
} 

这是拔示巴的解决方案不同,因为它保证了如果您的示例是400的倍数,则分配1:399。这意味着它可能不是您要查找的内容。

编辑我介绍了一个新的功能pick,其拍摄之间的随机数0(includive)和n(独家),它希望提供比模功能的更好的分配。

+0

No. No.兰特()%N是这个世界上这么多问题的原因!如果发生器的周期不是N的倍数,它会引入一个统计偏差。 – Bathsheba

+0

您的意思是饥饿,战争,恐怖主义? –

+1

;-)虽然我不想在导弹制导系统中的任何地方看到“rand()%'。 – Bathsheba