【发布时间】:2021-03-18 14:17:03
【问题描述】:
我有一个预定大小的整数数组,所有值都是 1 或 0,因此代表一个位序列。 我想以恒定的概率相互独立地随机“翻转”数组中的位(例如,千分之一的机会翻转位 i),但我需要以一种计算有效的方式来完成,而不是通过滚动每一位单独。 有没有在C中做到这一点的好方法? 我想过单独随机化错误的数量,然后选择随机索引来翻转,但我不确定如何随机化错误的数量开始......
【问题讨论】:
-
您是否尝试过实现并验证它的性能不够好?
-
所以你想比
for (i...) bit[i] ^= (rand() < (RAND_MAX / 1000));更有效率 -
任何与数组大小非线性的解决方案都将不胜感激
-
“千分之一的翻转机会”和“数组大小非线性”是不兼容的目标。
-
比特翻转的平均数是比特总数乘以单个比特翻转的概率。您可以通过随机调整平均值(例如正负 10%)来改变要执行的实际位翻转次数。理想情况下,应使用原始均值从泊松累积分布中随机选择位翻转次数。来自 GNU Scientific Library 的
gsl_ran_poisson函数可以用于此目的。一旦有了要翻转的位数,就可以随机生成每个翻转位的位置,并且最好是唯一的。