rand()每次运行程序时都返回相同的数字

rand() returns the same number each time the program is run

本文关键字:返回 数字 程序 运行 rand      更新时间:2023-10-16

在这个相当基本的涉及随机数生成的C++代码片段中:

include <iostream>
using namespace std;
int main() {
cout << (rand() % 100);
return 0;
}

为什么我总是得到41的输出?我正试图让它输出一些0到100之间的随机数。也许我不了解rand函数是如何工作的?

您需要更改种子。

int main() {
srand(time(NULL));
cout << (rand() % 101);
return 0;
}

这个srand也适用于C.


另请参阅:http://xkcd.com/221/

就其价值而言,您也只生成0到99(包括0和99)之间的数字。如果您想要生成0到100之间的值,则需要。

rand() % 101

除了其他人提到的调用srand()之外。

srand()为随机数生成器种子。如果没有种子,生成器将无法生成您要查找的数字。只要对随机数的需求不是安全关键的(例如,任何类型的密码学),通常的做法是通过使用<ctime>库中的time()函数来使用系统时间作为种子:srand(time(0))。这将用Unix时间戳(即自1970年1月1日起的秒数)表示的系统时间为随机数生成器种子。然后可以使用rand()生成一个伪随机数。

这里引用了一个重复问题:

原因是rand()函数生成的随机数不是实际上是随机的。这只是一种转变。维基百科提供了更好的伪随机数发生器意义的解释:确定性随机位生成器。每次调用rand()时,都会获取种子和/或生成的最后一个随机数(C标准没有指定算法使用,尽管C++11有指定一些流行算法的功能)对这些数字进行数学运算,并返回结果。所以如果种子状态每次都是一样的(如果你没有用true调用srand随机数),那么你总是会得到相同的"随机"数。

如果你想了解更多,你可以阅读以下内容:

http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/

http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/

您没有对数字进行种子设定。

使用此:

#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand(static_cast<unsigned int>(time(0)));
cout << (rand() % 100) << endl;
return 0;
}

不过,你只需要播种一次。基本上不要把每个随机数都作为种子。

像borland complexer 这样的随机函数

using namespace std;
int sys_random(int min, int max) {
return (rand() % (max - min+1) + min);
}
void sys_randomize() {
srand(time(0));
}

"srand(时间(NULL))"作为第1行;main()"如果你使用";rand()"在静态初始化时。在某处你最好创造";结构体rnd_init{rnd_init(){srand(time(nullptr));}}"命名任何适合你的,作为一个静态var,在其中";rand()"正在使用:在某个构造函数中,或者其他什么。