我正在尝试生成随机整数(均匀分布)。 我在其他论坛上找到了这个片段,但它的工作方式非常奇怪..
srand(time(NULL));
AB=rand() % 10+1;
使用这种方法,我得到一个循环中的值,因此每次调用时值都会增加,直到它再次下降。我想这与使用时间作为初始化器有关? 这样的东西出来了。
1 3 5 6 9 1 4 5 7 8 1 2 4 6 7.
但我希望得到像
这样的随机数字1 9 1 3 8 2 1 7 6 7 5...
感谢您的帮助
答案 0 :(得分:8)
每个程序只应调用一次srand()
。
答案 1 :(得分:3)
另请查看Boost随机数库:
答案 2 :(得分:1)
一些随机数生成器在使用“低位数”时存在问题,并存在偏差 如果你不丢弃一些数字,可能会解决这两个问题:
int alea(int n){
assert (0 < n && n <= RAND_MAX);
int partSize =
n == RAND_MAX ? 1 : 1 + (RAND_MAX-n)/(n+1);
int maxUsefull = partSize * n + (partSize-1);
int draw;
do {
draw = rand();
} while (draw > maxUsefull);
return draw/partSize;
}
答案 3 :(得分:0)
您可以使用Park-Miller“最小标准”线性同余发生器(LCG):(种子* 16807 mod(2 ^ 31 - 1))。我的实施在这里 Random integers with g++ 4.4.5
C语言的'srand()'函数用于设置'rand()'使用的全局变量。当你需要一个随机数序列时,'rand()'绰绰有余,但你经常需要几个随机数生成器。对于这些情况,我的建议是使用C ++和类似'rand31pmc'。
如果要在小范围内生成随机数,则可以使用此处提供的Java库实现: http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextInt%28int%29