生成许多​​,良好,均匀分布的随机数

时间:2018-04-24 04:55:33

标签: 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);
    return randomRealBetweenZeroAndOne;
}

每次我想在图表中加权时,我都会调用此函数并将其插入到我的邻接矩阵中。但是,我担心也许我使用慢速方法来生成这些数字。这对于小图表来说效果很好,但是我的较大图表非常慢(可能还有其它东西正在减慢速度,但我只想仔细检查并学习正确的方法)。保持数字质量但是尽快生成它们的最佳方法是什么?

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

修改

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

#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;
}

如果您发现任何问题,请告诉我,特别是如果多次调用此功能。

1 个答案:

答案 0 :(得分:1)

正如您在建议的解决方案中所建议的那样,每次需要随机数时,您都不想使用std::random_device并创建随机引擎。但我会避免让它们成为全局变量。我建议在函数中使用静态变量。它们仍然只被初始化一次,所以它会一样快,但它们会更加封装:

double randomZeroToOne()
{
    static mt19937 mt(std::random_device{}());
    static uniform_real_distribution<double> dist(0.0, 1.0);
    return dist(mt);
}

(请注意,同时从多个线程调用此函数是不安全的。如果需要,请将此处static更改为thread_local。)