【问题标题】:Randomizer in C++ [duplicate]C ++中的随机化器[重复]
【发布时间】:2015-10-15 00:00:03
【问题描述】:

我正在用 C++ 进行分配,其中有一部分我需要生成一个介于 0 和 2 之间的随机数。我知道生成这个数字的代码是

    int randomNumber = rand() % 3;

当我在循环中运行它时,它总是会生成随机数。但是,当我独立运行它时,它总是 2。我已经运行了一个程序 30 次,它不在循环中,并且随机化不是随机的。例如

    int randomNumber = rand() % 3;
    int randomNumber1 = rand() % 3;
    int randomNumber2 = rand() % 3;
    int randomNumber3 = rand() % 3;
    int randomNumber4 = rand() % 3;
    int randomNumber5 = rand() % 3;
    cout << randomNumber << endl << randomNumber1 << endl << randomNumber2 << endl << randomNumber3 << endl << randomNumber4 << endl << randomNumber5 << endl;

这将始终输出2,2,1,1,2,1

为什么这不是随机的,我如何让它随机?

如果重要的话,我使用的是 Visual Studio 2015。

【问题讨论】:

  • 1) rand() 需要使用 srand(seed) 播种 2) rand() 很烂,你应该永远不要使用它。请改用C++'s RNGs from the &lt;random&gt; header
  • 随机数有什么用?
  • 你需要使用srand()播种,这已经被介绍过无数次了。现在您知道了,忘记rand() 并开始使用&lt;random&gt; 中定义的类型;具体来说,看看mt19937uniform_int_distribution
  • 重复。已经被问了 100 次。 rand() 是伪 rand,需要播种。投票结束。
  • rand() 对于大多数非科学和非加密目的而言,快速、简单且完全可以。 (这更像是“% 是如何工作的”练习,而不是“如何生成好的随机数”练习。)

标签: c++ random


【解决方案1】:

伪随机数生成器不会生成真正的随机数,而是生成看似随机的数字序列。您对rand() 的实现似乎使用了伪随机生成器。您必须为其播种以生成另一个序列。

考虑改用std::random_device。大多数平台都支持非确定性随机源,所以大多数时候你会很安全。

【讨论】:

    【解决方案2】:

    添加

    #include <ctime>
    

    在代码的开头并在代码的开头调用 srand((unsigned int)time(NULL));(紧跟在 int main(){ 之后)。

    这将使您的代码生成不同的序列,除非您在 1 秒内再次执行代码。

    【讨论】:

    • 我可以在不包含其他库的情况下创建一个随机数吗?
    • 可以创建一个快速而肮脏的线性同余生成器。请参阅我对stackoverflow.com/questions/31739792/… 的回答请注意,采用% 会产生统计偏差,尽管我怀疑 %3 是否显着 cf。生成器本身的问题。
    猜你喜欢
    • 2015-03-31
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2014-06-28
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多