用于生成非均匀伪随机数的好库

时间:2009-11-06 23:28:09

标签: random

我正在寻找能够为C,C ++和Java生成非均匀分布的随机数的已知库。

由于

7 个答案:

答案 0 :(得分:5)

我在这个相关问题中得到了一些有趣的回答:

Biased random number sources

答案 1 :(得分:3)

对于Java,一个选项是我的Uncommons Maths库。它支持均匀,高斯,二项式,泊松和指数分布。有一个WebStart demo,所以你可以看到它的作用。

答案 2 :(得分:2)

看看Alglib's implementations,他们有一些基本的发行版以多种语言实现。

答案 3 :(得分:2)

GNU科学图书馆(GSL)http://www.gnu.org/software/gsl/提供了许多非均匀随机分布 - 参见手册第19章“随机数分布”。 (统一随机数生成器在第17章“随机数生成”中)。实施在C.

答案 4 :(得分:1)

Boost具有相当广泛的随机数生成选择,以及通过多个分布过滤这些内容的能力。

答案 5 :(得分:0)

Numerical Recipe讨论了一些随机数生成器的算法。

答案 6 :(得分:0)

使用 C ++ 11 ,有许多新选项可用于在random标头中生成非均匀伪随机数字。下面的示例代码演示了一些可能的非统一分布:

#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>

int main()
{
    std::random_device rd;

    std::mt19937 e2(rd());

    //
    // Distribtuions
    //
    std::normal_distribution<> dist(2, 2);
    //std::student_t_distribution<> dist(5);
    //std::poisson_distribution<> dist(2);
    //std::extreme_value_distribution<> dist(0,2);
    //std::lognormal_distribution<> dist(1.6, 0.25);
    //std::exponential_distribution<> dist(1);

    std::map<int, int> hist;
    for (int n = 0; n < 10000; ++n) {
        ++hist[std::round(dist(e2))];
    }

    for (auto p : hist) {
        std::cout << std::fixed << std::setprecision(1) << std::setw(2)
                  << p.first << ' ' << std::string(p.second/200, '*') << '\n';
    }
}

使用普通分发,您会看到与此类似的输出:

-5 
-4 
-3 
-2 *
-1 ***
 0 ******
 1 ********
 2 *********
 3 ********
 4 ******
 5 ***
 6 *
 7 
 8 
 9