C++使用default_random_engine在循环中生成随机数

Anw*_*sha 0 c++ random

最近我正在尝试使用中random engines定义的C++生成随机数的程序#include<random>.我的计划如下: -

#include <iostream>
#include <random>
#include <chrono>
using namespace std;
int random (int lim)
{
    default_random_engine dre (chrono::steady_clock::now().time_since_epoch().count());
    uniform_int_distribution<> uid(1,lim);
    return uid(dre);
}
int main()
{
    for (int i=0;i<10;++i)
    cout<<random(100)<<" ";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

简单,绝对!但是当我尝试输出时,这些数字不那么随机: -

66 95 95 96 96 96 96 96 97 97
Run Code Online (Sandbox Code Playgroud)

当我稍微改变我的程序并声明default_random_engineas static或者它global然后我的输出是正确的,如下: -

62 53 21 38 7 51 46 40 86 12
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出我的程序最初出现了什么问题吗?这些小变化如何帮助我获得更好的输出?

Nat*_*ica 6

每次运行时,random您都会使用相同或非常接近相同的种子重新生成生成器,这样您每次迭代都会得到相同的输出,或者如果它确实发生更改,则不会太多.

要解决此问题,您只需为生成器播种一次,然后继续调用它.通过使其静态,它按预期工作,因为生成器仅在您继续其随机序列而不是获得它将创建的第一个随机数时创建和播种.

通常,随机数生成器具有通过算法放置的内部值,并且算法吐出的内容是它们为随机数返回的内容.然后保留该数字用于算法的下一次迭代.这就是我们获得随机序列的方式.

如果我们使用相同的种子,我们将获得与从相同数字开始的相同的输出序列.在你的情况下,你的种子只会在每次chrono::steady_clock::now()进步时都会改变 ,你的循环运行速度会比这更快,因此每次调用都会获得相同的时间(种子).

  • @Anwesha:可能它的分辨率不够高,毕竟你在一个紧密的循环中调用它,每次调用之间可能有100条指令,所以它要么使用rdtsc,要么每次都用相同的值重新设置.但重点是已经解释过:你必须只播种一次*然后继续使用相同的随机引擎对象. (3认同)