闭区间内的均匀随机数发生器

alt*_*are 1 c c++ random gsl

我需要一个无偏的均匀随机数发生器(双重),用于c或c ++的闭合间隔,比如[0,1].

许多随机数生成器(例如GSL gsl_rng_uniform(r))仅在开放时间间隔内工作,如[0,1],但这不符合我的情况.

人.

Flo*_*ris 5

除非你有整数值,否则闭区间的概念有问题 - 因为击中区间"结束"的概率是无穷小的.如果您有一个具有最大值的整数随机数生成器RAND_MAX,那么您将通过计算得到一个闭合间隔

rand() / double(RAND_MAX)
Run Code Online (Sandbox Code Playgroud)

因为它将完全从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);
}
Run Code Online (Sandbox Code Playgroud)

现在,您已经对非常精细的随机数进行采样,最大值为1.0(含).你可以使代码更紧凑,但这是一般的想法......