我需要一个封闭时间间隔的c或c ++的无偏统一随机数生成器(双精度)(为double),例如[0,1]。
许多随机数生成器(例如GSL gsl_rng_uniform(r)
)仅在开放时间间隔内工作,例如[0,1),但这不适用于我的情况。
铝
除非您具有整数值,否则封闭间隔的概念存在问题-因为达到间隔“尽头”的可能性极小。如果您有一个具有最大值的整数随机数生成器RAND_MAX
,则可以通过计算得到一个封闭间隔
rand() / double(RAND_MAX)
因为它将精确地从0到1(包括1)
如果这样做不能为您提供足够的分辨率,则可以考虑“连接”多个随机数。假设双精度数的尾数实际上为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(含)。您可以使代码更紧凑,但这是总体思路...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句