在开放区间中生成均匀随机数

时间:2013-11-12 15:39:11

标签: c++ random

我无法找到一种在开放区间(如(0,1))中从均匀分布生成随机数的方法。

(double)rand()/RAND_MAX;

这包括0和1吗?如果是,在开放区间内生成随机数的正确方法是什么?

4 个答案:

答案 0 :(得分:1)

看看std::uniform_real_distribution!您可以使用比<cstdlib>的名为std :: rand()的bulit-in更专业的伪随机数生成器。这是一个代码示例,打印出范围[0,1)中的10个随机数:

#include <iostream>
#include <random>

int main()
{  
    std::default_random_engine generator;
    std::uniform_real_distribution<double> distribution(0.0,1.0);

    for (int i=0; i<10; ++i)
        std::cout << distribution(generator) << endl;

    return 0; 
}

不可能完全为零。如果你不能得到0是非常重要的,你可以检查它并生成另一个数字。

当然,您可以使用指定的随机数引擎,std::mt19937(即“非常”随机)或最快的std::knuth_b

答案 1 :(得分:0)

我没有多年编写C ++,但尝试以下代码:

double M = 0.00001, N = 0.99999;
double rNumber = M + rand() / (RAND_MAX / (N - M + 1) + 1);

答案 2 :(得分:0)

我几年没有用C ++编程,但是当我做rand的实现时,编译器是特定的。关于它们是否涵盖[0,RAND_MAX],[0,RAND_MAX),(0,RAND_MAX)或(0,RAND_MAX)的实现方式各不相同。这可能已经改变,我确信如果有的话,有人会发出声音。

假设实现超过了闭区间[0,RAND_MAX],那么(double)(rand()+1)/(RAND_MAX+2);应该产生一个开放区间U(0,1),除非RAND_MAX推进字大小,哪个案子投了很久。如果您的发电机覆盖范围不同,请调整添加剂常数。

更好的解决方案是抛弃rand并使用Boost库中的Mersenne Twister之类的东西。 MT有不同的调用,可以明确地控制结果的开/关范围。

答案 3 :(得分:0)

给定具有闭区间[a,b]的RNG的均匀分布,最简单的方法是简单地丢弃不需要的值,再次掷骰子。这在数值上是稳定的,实际上是保持均匀性的最快方法。

 double myRnD()
 {
    double a = 0.0;
    while (a == 0.0 || a == 1.0) a = (double)rand() * (1.0 / (double)RAND_MAX);
    return a;
 }

(免责声明:RAND_MAX必须是2的幂且<2 ^ 52)