rand() 即使在我的 Mac 上播种时也会给出序列号
rand() giving sequential numbers even when seeded on my Mac
这是最近才开始发生的。我注意到我的一个程序没有给出随机数,所以我制作了一个快速简单的随机数程序来测试它:
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
srand(time(NULL))
std::cout << rand() << std::endl;
return 0;
}
即使在播种时,它也会一直给出相同的随机数,只是在每次调用后增加一点。这是 运行 程序几次后的一些数字:
874692194, 874709001, 874725808, 874742615.
我把这个程序放在我的一台 Linux 机器上只是为了确定,正如预期的那样,它正确地产生了随机数。
那么为什么我的 Mac 没有生成随机数?我已经试过重启电脑,问题依旧。
在任何人说 "Why not use C++'s random library?" 之前,我们不允许在此计算中使用 C++11 功能 class,因此这不是解决方案。
像 rand() 这样的简单 PRNG 旨在生成一个数字序列,当作为一个序列进行分析时,这些数字是随机且均匀分布的。
如果您在播种后仅从 PRNG 生成一个数字,那么第一个数字实际上只是种子的哈希值,许多 PRNG 的种子哈希函数非常糟糕。
您可以改进种子,例如,将其作为时间的 MD5 散列加上进程 ID(以及您可能拥有的其他一些熵)。但是,您可以将其用作您的单个随机数,而根本不需要 PRNG。
这是最近才开始发生的。我注意到我的一个程序没有给出随机数,所以我制作了一个快速简单的随机数程序来测试它:
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
srand(time(NULL))
std::cout << rand() << std::endl;
return 0;
}
即使在播种时,它也会一直给出相同的随机数,只是在每次调用后增加一点。这是 运行 程序几次后的一些数字: 874692194, 874709001, 874725808, 874742615.
我把这个程序放在我的一台 Linux 机器上只是为了确定,正如预期的那样,它正确地产生了随机数。
那么为什么我的 Mac 没有生成随机数?我已经试过重启电脑,问题依旧。
在任何人说 "Why not use C++'s random library?" 之前,我们不允许在此计算中使用 C++11 功能 class,因此这不是解决方案。
像 rand() 这样的简单 PRNG 旨在生成一个数字序列,当作为一个序列进行分析时,这些数字是随机且均匀分布的。
如果您在播种后仅从 PRNG 生成一个数字,那么第一个数字实际上只是种子的哈希值,许多 PRNG 的种子哈希函数非常糟糕。
您可以改进种子,例如,将其作为时间的 MD5 散列加上进程 ID(以及您可能拥有的其他一些熵)。但是,您可以将其用作您的单个随机数,而根本不需要 PRNG。