【问题标题】:How to add random noise to an array of bits in C?如何向C中的位数组添加随机噪声?
【发布时间】: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 函数可以用于此目的。一旦有了要翻转的位数,就可以随机生成每个翻转位的位置,并且最好是唯一的。

标签: c random


【解决方案1】:

这是一个相当快的方法:

int array[10000];

for(int i=0; i<10; i++) {
    int index = rand() % 10000;
    array[index] = 1 - array[index]; // Flip between 1 and 0
}

它不是 100% 等同于您想要的,但应该足够好。由于您希望有 0.1% 的机会翻转一点,因此只需通过随机化索引来翻转 1000 次中的 1 次。如果你把同样的东西翻转两次,这并不重要。

如果您想要更多随机性,请执行以下操作:

int r = rand() % 4;
for(int i=0; i < 8+r; i++) {
    ...

任何与数组大小非线性的解决方案都会受到赞赏

从技术上讲,这种方法也是线性的。但仍然比随机化每个单独的元素快 1000 倍。但是,您想要的噪音越多,它就会越慢。

您可以通过将int 数组更改为char 数组来使此代码对缓存更加友好。既然你只想要 1 或 0,那就行了。

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 2015-03-31
    • 1970-01-01
    • 2020-04-22
    • 2020-11-01
    • 2018-03-05
    • 2019-07-01
    • 1970-01-01
    • 2021-03-14
    相关资源
    最近更新 更多