我无法找到一种在开放区间(如(0,1))中从均匀分布生成随机数的方法。
(double)rand()/RAND_MAX;
这包括0和1吗?如果是,在开放区间内生成随机数的正确方法是什么?
答案 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)