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

我将随机数生成器应用于我的代码,尽管当我第二次或第三次运行代码时生成的第一个数字没有改变。然而,其他数字发生变化,问题仅在于第一个值。我正在使用代码块; 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 提供了更强大的种子,但对于玩具程序来说,这就足够了。

https://stackoverflow.com/questions/73038129/

相关文章:

python - 如果我更改了类中的函数名称,该函数会发生什么变化?

awk - 在列中找到确切的字符串

java - 比较不同时区的 ZoneDdateTime

java - Maven:如何查找依赖项

java - 如何修复 java.lang.ClassNotFoundException : org

c++ - 尽管类型删除,是否可以使用静态多态性(模板)?

c++ - 优化静态字符串的字符串存储

sql - 甲骨文 SQL : SUM in first row with condition

regex - 如果使用 linux 命令行工具在文本文件的下一行中满足条件,则替换换行符

python - Pandas : Concat rows of a dataframe with