gpt4 book ai didi

c++ - 第二次编译时更改随机生成数字的值

转载 作者:行者123 更新时间:2023-12-05 09:27:01 25 4
gpt4 key购买 nike

我将随机数生成器应用于我的代码,尽管当我第二次或第三次运行代码时生成的第一个数字没有改变。然而,其他数字发生变化,问题仅在于第一个值。我正在使用代码块; Cygwin GCC 编译器 (c++ 17)。使用时间播种。

#include <iostream> 
#include <random>
#include <ctime>

int main()
{
std::default_random_engine randomGenerator(time(0));
std::uniform_int_distribution randomNumber(1, 20);
int a, b, c;
a = randomNumber(randomGenerator);
b = randomNumber(randomGenerator);
c = randomNumber(randomGenerator);
std::cout<<a<<std::endl;
std::cout<<b<<std::endl;
std::cout<<c<<std::endl;

return 0;
}

在这种情况下,当我第一次运行代码时,它可能会产生类似 a = 4、b = 5、c = 9 的结果。第二次和更长时间 (a) 仍然是 4,但 (b) 和 (c ) 不断变化。

最佳答案

根据我的评论, std::mt19937 是您应该考虑的主要 PRNG。这是<random>中提供的最好的一个.你也应该播种更好。这里我用std::random_device .

有些人会提示 std::random_device当无法找到真正的随机数据源时,会回退到确定性种子,但在低级嵌入式内容之外这种情况非常罕见。

#include <iostream>
#include <random>

int main() {
std::mt19937 randomGenerator(std::random_device{}());
std::uniform_int_distribution randomNumber(1, 20);

for (int i = 0; i < 3; ++i) {
std::cout << randomNumber(randomGenerator) << ' ';
}
std::cout << '\n';

return 0;
}

输出:

~/tmp 
❯ ./a.out
8 2 16

~/tmp
❯ ./a.out
7 12 14

~/tmp
❯ ./a.out
8 12 4

~/tmp
❯ ./a.out
18 8 7

在这里,我们看到四个截然不同的运行。因为你的范围很小,你会不时地看到模式弹出。还有其他方面的改进,特别是为 PRNG 提供了更强大的种子,但对于玩具程序来说,这就足够了。

关于c++ - 第二次编译时更改随机生成数字的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73038129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com