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

时间:2012-12-15 21:37:53

标签: c++ random

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

include <iostream>
using namespace std;

int main() {
    cout << (rand() % 100);
    return 0;
}

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

6 个答案:

答案 0 :(得分:34)

您需要更改seed

int main() {

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

srand播种的内容也适用于c语言代码。


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

答案 1 :(得分:13)

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

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

答案 2 :(得分:10)

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

rand() % 101

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

答案 3 :(得分:6)

你没有播种这个号码。

使用此:

#include <iostream>
#include <ctime>

using namespace std;

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

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

答案 4 :(得分:6)

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

以下是duplicate question

的引用
  

原因是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/

答案 5 :(得分:4)

随机函数,如borland编译器

using namespace std;

int sys_random(int min, int max) {
   return (rand() % (max - min+1) + min);
}

void sys_randomize() {
    srand(time(0));
}