RAND_MAX的值总是(2 ^ n)-1?

Ste*_*314 9 c++ random

我对C++感兴趣,但我怀疑只是导入C标准定义.我相信标准所说的答案是肯定的,但我对实践中的答案最感兴趣.

如果RAND_MAX总是(2 ^ n)-1,那么这简化了处理最近将代码从MinGW GCC移动到Linux GCC的问题.RAND_MAX似乎更大(我没有检查,但可能等于INT_MAX或符号是什么),所以一些旧的天真写的RAND_MAX - 不够大 - 所以 - 解决它的代码适得其反.现在我需要确定我需要这个库的一般性,考虑到编写正确处理溢出可能性的代码的繁琐,而不用假设例如int的宽度.

无论如何,是否有任何合理广泛使用的C++编译器使用除(2 ^ n)-1以外的东西用于RAND_MAX?

另外,我是否正确((RAND_MAX |(RAND_MAX >> 1))== RAND_MAX)总是并且仅当RAND_MAX等于((2 ^ n)-1)某些无符号整数n时才为真.我认为RAND_MAX在技术上是一个int,但是没有任何意义的是有一个负值或小数值,所以我认为我可以安全地折扣那些.比特摆弄通常不会打扰我,但我一直认为表情看起来不对,我无法弄清楚原因.

最后,虽然在我有自己的解决方案之前我不会高兴,但我应该使用随机数而不是自己编写?我需要0 <= x <参数范围内的随机数,我特别希望所有数字的概率相等.例如,取(rand()%upperbound)会偏向较小的值,特别是当上限很大时 - 我想避免这种情况.

是否有Boost或C++ 0x的东西?

编辑

在页面侧面的"相关"位中显示的内容显示确实有一种方法可以获得具有给定下限和上限的随机数.

APr*_*mer 5

  • 我不知道任何RAND_MAX不低于2的幂的实现,但这不是标准规定的;

  • ((RAND_MAX |(RAND_MAX >> 1))== RAND_MAX)确实是一种测试RAND_MAX是否小于2的幂的方法.

  • 我正在使用

    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; 
    }
    
    Run Code Online (Sandbox Code Playgroud)

从rand()中尽可能均匀地分布随机数.


Fre*_*Foo 4

我不知道保证是什么RAND_MAX,但如果可能的话,您最好避免它,因为周围有很多损坏的实现,而且它在当今的应用程序中开始循环得很快。此处描述了获得均匀分布。

我推荐使用Boost.Random。梅森扭曲生成器代表了速度、内存使用和质量之间的良好权衡。