gpt4 book ai didi

c++ - 闭区间均匀随机数发生器

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:03 26 4
gpt4 key购买 nike

我需要一个用于 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(含)的随机数。您可以使代码更紧凑一些,但这是一般的想法...

关于c++ - 闭区间均匀随机数发生器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21631061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com