【发布时间】:2013-11-25 01:38:38
【问题描述】:
所以几天来我一直在寻找一个函数,它需要 2 个参数一个低值和一个高值(都是 64 位整数),而不是在这些范围之间生成一个随机数。我一直遇到的问题是这个数字不是 64 位整数。或者边缘的数字比中间的数字更常见。
这是一些代码:它只是不断返回 -1 或 0...
#include<stdio.h>
#include<stdlib.h>
#include<inttypes.h>
int64_t range1=0,range2=18446744073709551614;
int64_t getRandomInRange(int64_t low, int64_t high )
{
int64_t base_random = rand();
if (RAND_MAX==base_random) return getRandomInRange(low, high);
int range = high-low,
remainder = RAND_MAX%range,
bucket = RAND_MAX/range;
if (base_random < RAND_MAX-remainder) {
return low+base_random/bucket;
} else {
return getRandomInRange(low, high);
}
}
int main () {
int i;
for (i=0;i<100;i++) {
printf("random number: %lld\n",getRandomInRange(range1, range2));
}
}
【问题讨论】:
-
不确定您的代码示例打算做什么...看看math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt64.html
-
它不允许我把它放在一个非常烦人的范围内......
-
random_value % (rangeend - rangestart) + rangestart -
@keltar 仅当
random_value具有非常高的精度时才有效。明显超过 64 位。所以这很难使用标准c实现。还有整数溢出的风险。例如考虑有符号整数,其中rangeend具有最大值,rangestart the minimum value。 -
搜索一个好的第三方随机数生成器库,它有一个内置函数。放弃
rand(),它已经坏了,无法修复。