c - srand() — 为什么只调用一次?

标签 c random srand

这个问题是关于这个问题中的评论 Recommended way to initialize srand?第一条评论说 srand() 应该在应用程序中只调用一次。为什么会这样?

最佳答案

这取决于您要实现的目标。

随机化是作为具有起始值的函数执行的,即种子

因此,对于相同的种子,您将始终获得相同的值序列。

如果您每次需要随机值时都尝试设置种子,并且种子是相同的数字,您将始终获得相同的“随机”值。

种子通常取当前时间,即秒数,如time(NULL),所以如果你总是在取随机数之前设置种子,你会得到相同的数字只要您在同一秒内多次调用 srand/rand 组合。

为了避免这个问题,每个应用程序只设置一次 srand,因为两个应用程序实例是否会在同一秒内初始化是值得怀疑的,因此每个实例都会有不同的随机数序列。

但是,您有可能会在一秒钟内多次运行您的应用程序(特别是如果它是一个简短的应用程序,或者命令行工具或类似的东西),那么您将不得不求助于其他方式选择种子(除非您可以在不同的应用程序实例中使用相同的序列)。但正如我所说,这取决于您的应用程序使用上下文。

此外,您可能想尝试将精度提高到微秒(尽量减少相同种子的机会),需要 (sys/time.h):

struct timeval t1;
gettimeofday(&t1, NULL);
srand(t1.tv_usec * t1.tv_sec);

关于c - srand() — 为什么只调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49074045/

相关文章:

c - UDP 服务器子进程无法发送

c - 为什么 int 指针的大小与 int 数组的大小不同?

c - 为什么对 C 枚举定义中的值使用 Bitwise-Shift 运算符?

当我运行程序时 c++ srand 工作但在 gdb 中不工作

c++ While循环终止与功能

c - 如何覆盖(重置)SIGUSR1 的默认行为?

python - 为 nan 值 numpy 数组放置随机数

c - 使用英特尔 MKL 即时生成随机数

php - 选择 while 循环生成的随机数组

c - 简单的随机数游戏程序