c++ 兰德()在程序每次运行时返回相同的数字

axr492tv  于 2022-12-30  发布在  其他
关注(0)|答案(7)|浏览(115)

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

include <iostream>
using namespace std;

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

为什么我总是得到一个41的输出,我试着让它输出一个0到100之间的随机数,也许我不理解rand函数是怎么工作的?

62o28rlo

62o28rlo1#

您需要更改seed

int main() {

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

srand播种对于c代码也是正确的。
另请参阅:http://xkcd.com/221/

fnvucqvd

fnvucqvd2#

你需要“播种”发电机。看看这个短视频,它会把事情弄清楚。
https://www.thenewboston.com/videos.php?cat=16&video=17503

jpfvwuh4

jpfvwuh43#

值得一提的是,你也只生成了0到99(含)之间的数字。如果你想生成0到100之间的值,你需要。

rand() % 101

此外还调用其他人提到的srand()。

qhhrdooz

qhhrdooz4#

你不能播号码。
使用此:

#include <iostream>
#include <ctime>

using namespace std;

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

不过你只需要给它种一次种,基本上不要给每个随机数都种。

50pmv0ei

50pmv0ei5#

srand()为随机数生成器设定种子。如果没有种子,生成器将无法生成您要查找的数字。只要用户对随机数的需求不是安全关键的(例如,任何类型的加密),通常的做法是使用<ctime>库中的time()函数将系统时间用作种子,如下所示:srand(time(0))。这将使用表示为Unix时间戳的系统时间(即自日期1/1/1970以来的秒数)作为随机数生成器的种子。然后,您可以使用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/

sbdsn5lh

sbdsn5lh6#

Borland编译器等随机函数

using namespace std;

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

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

jdzmm42g7#

“srand(时间(空));“作为“main()”的第一行,如果您在静态init.某处使用“兰德()”,将不会有任何帮助。您最好创建“struct rnd_init { rnd_init(){ srand(time(nullptr));} }”,命名为任何适合您的名称,作为使用“兰德()”的作用域中的静态变量:在某个构造器上,或者别的什么地方

相关问题