随机整数c ++

时间:2009-09-03 07:39:10

标签: c++ integer random

我正在尝试生成随机整数(均匀分布)。 我在其他论坛上找到了这个片段,但它的工作方式非常奇怪..

 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...

感谢您的帮助

4 个答案:

答案 0 :(得分:8)

每个程序只应调用一次srand()

答案 1 :(得分:3)

另请查看Boost随机数库:

Boost Random Number Library

答案 2 :(得分:1)

  • srand()必须每次执行一次,而不是每次执行rand()一次
  • 一些随机数生成器在使用“低位数”时存在问题,并存在偏差 如果你不丢弃一些数字,可能会解决这两个问题:

    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