gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:19:08 27 4
gpt4 key购买 nike

我对 C++ 很感兴趣,尽管我怀疑它只是导入了 C 标准定义。我相信标准所说的答案是否定的,但我对实际答案最感兴趣。

如果 RAND_MAX 始终为 (2^n)-1(其中 n 是某个自然数 - 实际上是随机数中随机二进制数字的数量),这会简化处理最近从 MinGW 移动代码时出现的问题GCC 到 Linux GCC。 RAND_MAX 似乎更大(我没有检查,但可能等于 INT_MAX 或任何符号),所以一些旧的天真编写的 RAND_MAX-isn't-big-enough-so-work-around-it 代码适得其反。现在我需要决定我需要这个库的通用性,考虑到编写正确处理溢出可能性的代码的繁琐程度而不对例如。 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 吗?

编辑

页面侧面“相关”位中的内容表明确实有一种方法可以在 boost 中获取具有给定下限和上限的随机数。

最佳答案

  • 我不知道 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;
    }

从 rand() 生成尽可能均匀分布的随机数。

关于c++ - RAND_MAX 的值总是 (2^n)-1 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4945698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com