rand() 在应用程序重新启动时总是返回相同的序列

Posted

技术标签:

【中文标题】rand() 在应用程序重新启动时总是返回相同的序列【英文标题】:rand() always returns the same sequence on application restart 【发布时间】:2012-10-27 18:45:32 【问题描述】:

我有以下生成随机数的方法:

int random_number() //Random number generator

    int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000
    return x;

对该方法的调用用于循环五次。这种方法的问题在于,在多次运行程序时,它似乎总是生成相同的数字。怎么解决?

【问题讨论】:

srand() 可能会派上用场。但是,当/如果您发现 1000000 明显大于 RAND_MAX 的大多数实现定义时,您可能会感到沮丧。 【参考方案1】:

在您的程序启动时拨打srand(time(NULL));

srand 为 rand 函数设置种子。为它提供time(NULL) 的返回值有助于在每次程序运行时获得不同的种子。

当您将问题标记为 c++ 时,您可以使用 c++11 功能来处理 random 数字生成。

【讨论】:

您的建议奏效了。但是,所有五个文件现在都具有相同的名称:s 什么文件(你在说什么)?【参考方案2】:

你需要seed随机数生成器,如:

srand ( time(NULL) );
int x = rand() % 1000000 + 1;

为伪随机数生成器播种基本上决定了它将迭代的随机数集。使用时间是获得足够随机结果的标准方法。

编辑:

为了澄清,您应该只播种一次并获得许多随机数,如下所示:

srand ( time(NULL) );
loop 
    int x = rand() % 1000000 + 1;

而不是类似的东西:

loop 
    //Particularly bad if this line is hit multiple times in one second
    srand ( time(NULL) ); 
    int x = rand() % 1000000 + 1;

【讨论】:

您的建议有效,但从一个循环到下一个循环,数字似乎没有变化。因此所有文件最终都具有相同的名称 如果您正在迭代循环,请不要在每次迭代时调用 srand。只调用一次,然后调用无数次。如果您每次都调用两者,则同一秒内的任何调用都将返回相同的数字(因为 time(NULL) 将返回相同的值)。 当我使用这个(对于小范围的数字)我得到一致的重复,比如说我希望得到一个介于 0 和 5 之间的随机数;我会按顺序 0 五次,1 五次,2 五次,依此类推。【参考方案3】:

femtoRgon 是对的。这将为程序播种,但看看新的 c++ 标准,因为它们改进了随机数生成 见

Random numbers in C++0x

【讨论】:

【参考方案4】:

rand 并不是一个真正的随机数,而是一个伪随机数,如果您不知道用于生成值的算法,它只会“看起来”随机。从手册页:

rand() 函数返回 0 到 RAND_MAX 范围内的伪随机整数

伪随机意味着给定相同的输入,称为种子,它将给出相同的输出。当您尝试调试问题时,这实际上非常有用,因为将返回相同的“随机”值,让您重现问题。 如果你真的需要随机性,那就不好了。

如上所述,通过在每次运行时将种子更改为不同的值,例如自纪元以来的秒数,您可以通过调用 rand() 获得不同的值。

srand(time(NULL))

如果您尝试调试,可能需要打印出种子,以便在出现问题时重现问题。

【讨论】:

以上是关于rand() 在应用程序重新启动时总是返回相同的序列的主要内容,如果未能解决你的问题,请参考以下文章

为啥我总是用 rand() 得到相同的随机数序列?

rand() 有时会连续返回相同的值吗?

ORDER BY RAND() 总是在 IE 上给出相同的行

Android 位置管理器每次返回相同的 GPS 坐标

Android:当应用程序被销毁和重新创建时总是启动启动活动

Unity Hub不断询问相同的更新,但是在计算机重新启动后降级[关闭]