我有一个程序,我使用drand48和程序的许多部分。程序要求是这样的,你需要程序每次生成相同的数字,除了我需要让程序在不同的运行中生成不同的数字的一部分。
现在,如果我在程序开头使用srand(time(NULL))
(如许多论坛中所建议的那样),那么当我多次运行程序时,我最终会更改所有数字。
如果我在相关循环中使用srand(time(NULL))
我想要进行更改(跨程序运行),则没有任何反应,并且随机数没有变化。
有没有解决方案?
答案 0 :(得分:0)
C库支持各种不同的随机数生成器。
drand48()
属于一系列函数,它们根据公式 r n +1 生成48位伪随机值=( a · r n + c )mod m < / em>,其中 a = 0xfdeece66d, c = 0xb, m = 2 48 。要为这些函数设置新的随机种子,您必须使用srand48()
或seed48()
。
srand()
对这些功能没有任何影响,因为它属于包含rand()
的不同呼叫系统。但这意味着您可以在希望随机数重复的地方继续使用drand48()
,并在每次希望随机数不同的地方使用srand()
/ rand()
答案 1 :(得分:0)
如果您使用的是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扩展来创建随机数状态缓冲区的每线程实例。
答案 2 :(得分:0)
如果您想调整基础生成器的参数,请遵循jxh的建议;如果你对另一个种子感到满意,只需使用drand48
的堂兄erand48
。