我需要一个用于 c 或 c++ 的无偏均匀随机数生成器( double ),在封闭区间,比如 [0,1]。
许多随机数生成器,例如 GSL gsl_rng_uniform(r)
,仅在开区间工作,如 [0,1),但这不适合我的情况。
铝
除非您有整数值,否则闭区间的概念有问题 - 因为达到区间“终点”的概率无限小。如果你有一个最大值为 RAND_MAX
的整数随机数生成器,那么你可以通过计算得到一个闭区间
rand() / double(RAND_MAX)
因为它会正好从 0 到 1(含)
如果这不能为您提供足够的分辨率,您可以考虑“连接”多个随机数。鉴于 double 实际上有 53 位的尾数(加上“始终为 1”的一位),您可以这样做(此代码假定 RAND_MAX = 0xFFFFFFFF 以提高可读性;您可以对其进行改进...):
#include <stdio.h>
#include <stdlib.h>
double goodRand() {
unsigned long long r;
unsigned long long int r1, r2;
r1 = rand();
r2 = rand();
r = (r1 << 22) + (r2 & 0x003FFFFF);
return (double) r/ (double)(0x001FFFFFFFFFFFFF);
}
int main(void) {
int i;
double rMax = 0;
for (i =0; i < 10000; i++) {
double temp;
temp = goodRand();
rMax = (temp>rMax)?temp:rMax;
}
printf("max value is %lf\n", rMax);
}
现在您已经非常精细地采样了最大值为 1.0(含)的随机数。您可以使代码更紧凑一些,但这是一般的想法...
我是一名优秀的程序员,十分优秀!