【发布时间】: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) 也应该是。由于data 是const data 类型,data.size * 8 应该能够优化为调用时间常数,而不是在 for 循环的每次迭代中进行评估。
但是,位操作很慢,fill_data_with_randomness 函数会被非常频繁地调用。此函数应在 2^n-1 形式的任何 RAND_MAX 值的系统上编译并正确运行。有什么fill_data_with_randomness 函数可以快速用rand()mness 填充这个内存区域而不浪费位?
【问题讨论】:
-
为什么需要一点一点的?如果你的数据大小是
rand()返回值大小的倍数,你能不能不把rand()的返回值一块一块地赋值给数据?或者如果它是字节对齐的,则分配rand()&0xFF的返回值? -
@GovindParmar 我将编辑问题以使其清楚。我一直在寻找一种比简单的逐位更快的方法——如果可能的话,不会像
&0xFF那样浪费rand()位。但是,如果每个字节的rand()调用比任何其他解决方案都更有效,我会使用它。