0

我有一个程序,我在其中使用 drand48 和程序的许多部分。程序要求是,您需要程序每次生成相同的数字,除了我需要让程序在不同的运行中生成不同数字的部分。

现在,如果我srand(time(NULL))在程序开始时使用(如许多论坛中所建议的那样),我最终会在多次运行程序时更改所有数字。

如果我srand(time(NULL))在我希望发生更改的相关循环内使用(跨程序运行),则不会发生任何事情并且随机数不会发生变化。

有针对这个的解决方法吗 ???

4

3 回答 3

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;
}

我使用__threadGCC 扩展来创建随机数状态缓冲区的每个线程实例。

于 2013-10-28T20:05:08.577 回答
0

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()在您希望随机数每次都不同的地方。

于 2013-10-28T19:54:52.407 回答
0

如果要调整底层生成器的参数,请遵循 jxh 的建议;如果您对不同的种子感到满意,只需使用drand48'scousin, erand48.

编辑:你在使用仿生 libc 吗?因为在Undefined reference error - rand的讨论表明仿生的 rand() 只是 drand48 和朋友的包装器(错误,错误,错误!)

于 2013-10-29T15:01:07.430 回答