【问题标题】:Populate a region of memory with random data用随机数据填充内存区域
【发布时间】:2017-06-02 13:47:50
【问题描述】:

我正在尝试以一种有效的方式使用rand 跨平台随机填充数据区域。这是我目前所拥有的:

/**********************************************\
*          Useful macro by Glen Ragen          *
* https://stackoverflow.com/a/39920811/5223757 *
\**********************************************/
#if 1 /* So that the IDE minifies it */
#define NEEDS_BIT(N, B)     (((unsigned long)N >> B) > 0)

#define BITS_TO_REPRESENT(N)                   \
        (NEEDS_BIT(N,  0) + NEEDS_BIT(N,  1) + \
         NEEDS_BIT(N,  2) + NEEDS_BIT(N,  3) + \
                         ...
         NEEDS_BIT(N, 60) + NEEDS_BIT(N, 61) + \
         NEEDS_BIT(N, 62) + NEEDS_BIT(N, 63)   \
        )
#endif /* So that the IDE minifies it */

typedef struct {
    size_t size; /* Size in bytes */
    void *pointer;
} data;

void fill_data_with_randomness(const data data) {
    for (size_t biti = 0; biti < data.size * 8; biti += BITS_TO_REPRESENT(RAND_MAX)) {
        /* Fill data.pointer with bits from rand() */
    }
}

RAND_MAX 是编译时常量,BITS_TO_REPRESENT(RAND_MAX) 也应该是。由于dataconst data 类型,data.size * 8 应该能够优化为调用时间常数,而不是在 for 循环的每次迭代中进行评估。

但是,位操作很慢,fill_data_with_randomness 函数会被非常频繁地调用。此函数应在 2^n-1 形式的任何 RAND_MAX 值的系统上编译并正确运行。有什么fill_data_with_randomness 函数可以快速用rand()mness 填充这个内存区域而不浪费位?

【问题讨论】:

  • 为什么需要一点一点的?如果你的数据大小是rand()返回值大小的倍数,你能不能不把rand()的返回值一块一块地赋值给数据?或者如果它是字节对齐的,则分配rand()&amp;0xFF的返回值?
  • @GovindParmar 我将编辑问题以使其清楚。我一直在寻找一种比简单的逐位更快的方法——如果可能的话,不会像&amp;0xFF那样浪费rand()位。但是,如果每个字节的 rand() 调用比任何其他解决方案都更有效,我会使用它。

标签: c random populate


【解决方案1】:

RAND_MAX 保证至少为 215−1,因此通过一次调用 rand() 来填充整个字节是没有问题的,除非您的体系结构的字节大于15 位(在这种情况下,您的硬编码乘以 8 也会有问题)。

逐字节进行生成是直截了当的,不需要聪明的比特破解。

就个人而言,我不会担心调用rand() 会“浪费比特”;该标准库函数产生的位在大多数实现中并不值钱。真正的问题是决定丢弃哪些位,以便剩余的位合理分布。如果可能,为了应对通常使用的劣质 PRNG 范围,您应该选择中间位。

更好的解决方案可能是简单地提供您自己的 PRNG;存在可移植的源代码实现,其中一些已经得到很好的研究。

【讨论】:

  • 嗯,这是一个反高潮。我想这是有原因的,我查看的所有其他代码示例都在 &amp;0xFF%256 上使用了一些变体。
  • @wizzwizz4:正如我在编辑中提到的,我建议使用rand()/8%256 之类的东西来避免低位。
猜你喜欢
  • 1970-01-01
  • 2011-03-23
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多