【发布时间】:2018-11-21 23:28:24
【问题描述】:
如果rand() 函数创建了一个长度为 4 字节的随机数,并且我想创建一个长度为 1024 位(128 字节)的随机数,那么通过连接 @ 987654322@函数256次还是有替代方法?
#include <stdio.h>
#include <string.h>
int main(void) {
const char data[128];
memset(&data, 0x36, 128);
printf("%s\n", data);
puts("");
printf("%d\n", sizeof(data)/sizeof(data[0]));
puts("");
int i = 0;
unsigned long rez = 0;
for(i = 0; i < 20; i++) {
unsigned int num = rand();
rez = rez + num;
printf("%x\n", rez);
}
printf("%x\n", rez);
return 0;
}
【问题讨论】:
-
为什么是 256 次? 128 字节 / 4 字节 = 32
-
这当然是 最简单 的方法,一旦你得到正确的数学,根据@Gerhardh - 你只需要调查分布是否是你想要的。如果它是一个简单的 PRNG(例如,如果它遵循
t(n) = t(n-1) * m + c modulo x方法),您可能会发现一些 128 位值是不可能的。 -
更一般地说,“连接”意味着您必须将当前累积的值反复乘以
RAND_MAX + 1,然后将下一个rand()结果添加到产品中。重复直到达到所需的长度。 -
请注意,
rand()生成介于 0 和RAND_MAX之间的随机数,通常小于 2³²-1(经典案例:MSVC++);因此,说它生成一个 4 字节的随机数是不正确的。 -
strcat与此有关。实现这一目标的最佳方式取决于几个因素。是否支持 1024 位算术?你的rand()真的会生成 4 个字节的随机位吗?同样,我在上面的评论中描述了“连接”结果的最通用方法:重复使用算术、乘法和加法。