如何只为一个随机数生成器生成不同的随机数,并保持其他随机数相同

时间:2013-10-28 19:04:29

标签: c random numbers random-seed

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

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

如果我在相关循环中使用srand(time(NULL))我想要进行更改(跨程序运行),则没有任何反应,并且随机数没有变化。

有没有解决方案?

3 个答案:

答案 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

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