我有一个程序,我在其中使用 drand48 和程序的许多部分。程序要求是,您需要程序每次生成相同的数字,除了我需要让程序在不同的运行中生成不同数字的部分。
现在,如果我srand(time(NULL))
在程序开始时使用(如许多论坛中所建议的那样),我最终会在多次运行程序时更改所有数字。
如果我srand(time(NULL))
在我希望发生更改的相关循环内使用(跨程序运行),则不会发生任何事情并且随机数不会发生变化。
有针对这个的解决方法吗 ???
我有一个程序,我在其中使用 drand48 和程序的许多部分。程序要求是,您需要程序每次生成相同的数字,除了我需要让程序在不同的运行中生成不同数字的部分。
现在,如果我srand(time(NULL))
在程序开始时使用(如许多论坛中所建议的那样),我最终会在多次运行程序时更改所有数字。
如果我srand(time(NULL))
在我希望发生更改的相关循环内使用(跨程序运行),则不会发生任何事情并且随机数不会发生变化。
有针对这个的解决方法吗 ???
如果您使用的是 GNU 系统,您可以使用 [drand48_r()][1]
接口来实现这一点。
__thread struct drand48_data drand48_same_buffer;
double drand48_same () {
double x;
drand48_r(&drand48_same_buffer, &x);
return x;
}
我使用__thread
GCC 扩展来创建随机数状态缓冲区的每个线程实例。
C 库支持各种不同的随机数生成器。
drand48()
属于基于公式r n +1 = ( a · r n + c ) mod m生成 48 位伪随机值的函数族,其中a = 0xfdeece66d、c = 0xb 和m = 2 48。要为这些函数设置新的随机种子,您必须使用srand48()
或seed48()
。
srand()
不会对这些函数产生任何影响,因为它属于不同的调用系统,其中包括rand()
. 但这意味着您可以继续drand48()
在您希望随机数可重复的地方使用,和srand()
/rand()
在您希望随机数每次都不同的地方。
如果要调整底层生成器的参数,请遵循 jxh 的建议;如果您对不同的种子感到满意,只需使用drand48
'scousin, erand48
.
编辑:你在使用仿生 libc 吗?因为在Undefined reference error - rand的讨论表明仿生的 rand() 只是 drand48 和朋友的包装器(错误,错误,错误!)