除非你有整数值,否则闭区间的概念有问题 - 因为击中区间"结束"的概率是无穷小的.如果您有一个具有最大值的整数随机数生成器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(含).你可以使代码更紧凑,但这是一般的想法......