24

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

include <iostream>
using namespace std;

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

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

4

6 回答 6

35

你需要改变种子

int main() {

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

srand播种对于语言代码也是如此c


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

于 2012-12-15T21:42:48.057 回答
15

您需要“播种”生成器。看看这个简短的视频,它会清除一切。

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

于 2012-12-15T21:41:15.117 回答
10

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

rand() % 101

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

于 2013-04-11T16:15:49.783 回答
6

你没有播种号码。

用这个:

#include <iostream>
#include <ctime>

using namespace std;

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

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

于 2012-12-15T21:43:17.363 回答
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/

于 2012-12-15T21:52:03.097 回答
4

像borland编译器这样的随机函数

using namespace std;

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

void sys_randomize() {
    srand(time(0));
}
于 2013-09-17T08:08:18.443 回答