【发布时间】:2022-01-12 23:41:55
【问题描述】:
遇到生成随机字符串的问题。
下面的示例生成重复的随机字符串块。块中随机字符串的数量取决于“WORD_LENGTH”。对于 1M 'COUNT' 和 'WORD_LENGTH' 的 20 个字符,每个块包含 262144 (2^18) 个随机字符串,然后块重复。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define WORD_LENGTH 20
//const char charset[62] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
const char charset[16] = "0123456789abcdef";
int main(int argc, char** argv) {
srand(time(NULL));
if (argc != 2) {
printf("Usage: program COUNT'\n\n");
return 0;
}
unsigned int count = atoi(argv[1]);
char buf[WORD_LENGTH];
for (int c = 0; c < count; c++ ) {
for (int i = 0; i < WORD_LENGTH; ++i) {
buf[i] = charset[ rand() % sizeof charset];
}
buf[WORD_LENGTH] = '\0';
printf("%s\n", buf);
}
return 0;
}
重要的事情。当“..charset[62]...”与 'COUNT' 高达 100M 一起使用时,我无法重现“问题”。 问题:有人能解释一下为什么会这样吗?
【问题讨论】:
-
RAND_MAX(<stdlib.h>中定义的常量)是否设置为32767(2^15 - 1) 或2147483647(2^31 - 1) 或其他数字? -
你的内部循环“浪费”了一个随机值;循环将一个随机值写入
buf[WORD_LENGTH - 1],然后循环之后的代码用空字节覆盖它。不是大问题,但有点粗心。 -
@Jonathan Leffler。是的。我明白了。
标签: c random random-seed