C++ 生成许多好的均匀分布的随机数

C++ 生成许多好的均匀分布的随机数,c++,random,graph-theory,C++,Random,Graph Theory,我正在对随机权重的非常大的图进行分析。我知道使用rand()函数很糟糕,所以我一直在使用这个函数,因为我读到的是正确的随机数生成: double randomZeroToOne() { random_device rd; mt19937 mt(rd()); uniform_real_distribution<double> dist(0.0, 1.0); double randomRealBetweenZeroAndOne = dist(mt);

我正在对随机权重的非常大的图进行分析。我知道使用
rand()
函数很糟糕,所以我一直在使用这个函数,因为我读到的是正确的随机数生成:

double randomZeroToOne()
{
    random_device rd;
    mt19937 mt(rd());
    uniform_real_distribution<double> dist(0.0, 1.0);
    double randomRealBetweenZeroAndOne = dist(mt);
    return randomRealBetweenZeroAndOne;
}
double random zerotoone()
{
随机器件rd;
mt19937 mt(rd());
均匀实分布距离(0.0,1.0);
双随机realBetweenZeroAndOne=距离(mt);
返回随机实数介于nzero和one之间;
}
每次我想在我的图中加一个权重,我调用这个函数并将它插入到邻接矩阵中。然而,我担心,也许我正在使用一种缓慢的方法来生成这些数字。这对于小图形来说效果很好,但是我的大图形速度非常慢(可能是其他原因使它变慢了,但我只是想再次检查并学习正确的方法)。保持数字质量的最佳方法是什么,但要尽快生成数字

另外,如果你知道一种用快速、良好、均匀分布的随机数初始化已知大小的向量的方法,那就更好了(尽管我仍然对我的主要问题的答案感到好奇)

编辑:

这是我提出的新解决方案:

#include <iostream>
#include <random>
#include<vector>
#include<iomanip>
#include<cmath>
using namespace std;

random_device rd;
mt19937 mt(rd());
uniform_real_distribution<double> dist(0.0, 1.0);

int main()
{
    double randomRealBetweenZeroAndOne = dist(mt);
    double anotherRandomRealBetweenZeroAndOne = dist(mt);
    double anothernother = dist(mt);
    vector<double> randoman(10,dist(mt));
    cout << randomRealBetweenZeroAndOne << endl;
    cout << anotherRandomRealBetweenZeroAndOne <<endl;
    cout << anothernother <<endl;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
随机器件rd;
mt19937 mt(rd());
均匀实分布距离(0.0,1.0);
int main()
{
双随机realBetweenZeroAndOne=距离(mt);
另一个双随机数介于两个随机数和一个随机数之间=距离(mt);
双另一个=距离(mt);
向量随机数(10,区(mt));

cout正如您在建议的解决方案中所建议的那样,您不希望在每次需要随机数时都使用
std::random_device
并创建随机引擎。但我会避免将它们设置为全局变量。我建议在函数中使用静态变量。它们仍然只初始化一次,因此速度也一样快,但它们是e然后再封装一点:

double randomZeroToOne()
{
    static mt19937 mt(std::random_device{}());
    static uniform_real_distribution<double> dist(0.0, 1.0);
    return dist(mt);
}
double random zerotoone()
{
静态mt19937mt(std::random_设备{}());
静态均匀实分布距离(0.0,1.0);
返回区(mt);
}

(请注意,同时从多个线程调用此函数是不安全的。如果这是一个需求,请将
静态
更改为
线程\u本地

只使用一个引擎。对
随机设备的多次调用当然很慢。的可能重复。那么,生成类的正确解决方案,如布尔文章中所述?或者有一个更简单的方法可以在函数中完成吗?我只是将函数的前三行放在程序的最顶端(在全局名称空间中,我认为——不确定该名称空间的正确术语),并将我的函数保留为最后两行。这是一个很好的实现吗?