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

cod*_*ude 23 c++ random

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

include <iostream>
using namespace std;

int main() {
    cout << (rand() % 100);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

0x9*_*x90 34

你需要改变种子.

int main() {

    srand(time(NULL));
    cout << (rand() % 101);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

srand播种的事情是真实的也是一个c语言代码.


另见:http: //xkcd.com/221/


Aar*_*ron 13

你需要"播种"发电机.看看这个简短的视频,它会清除.

https://www.thenewboston.com/videos.php?cat=16&video=17503


Dun*_*ter 10

对于它的价值,你也只生成0到99(含)之间的数字.如果您想生成0到100之间的值,则需要.

rand() % 101
Run Code Online (Sandbox Code Playgroud)

除了调用别人提到的srand()之外.


小智 6

你没有播种这个号码.

用这个:

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
    srand(static_cast<unsigned int>(time(0)));
    cout << (rand() % 100) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你只需要播种一次.基本上不要每个随机数播种.


小智 6

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

以下是重复问题的引用:

原因是从rand()函数生成的随机数实际上不是随机数.这只是一种转变.维基百科更好地解释了伪随机数生成器的含义:确定性随机比特生成器.每次调用rand()时,都会生成种子和/或生成的最后一个随机数(C标准没有指定使用的算法,尽管C++ 11具有指定一些流行算法的工具),运行一个对这些数字进行数学运算,并返回结果.因此,如果种子状态每次都相同(如果您不使用真正的随机数调用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/