gpt4 book ai didi

c++ - 为什么 uniform_int_distribution 适用于 62 位数字但不适用于 63 或 64 位数字?

转载 作者:IT老高 更新时间:2023-10-28 21:52:11 25 4
gpt4 key购买 nike

我很难理解为什么这段代码是尝试使用新的 <random> C++11 中的 header ,在 [0, 2**62 - 1] 中正确生成随机数但不是 [0, 2**63 - 1][0, 2**64 - 1] .

#include <iostream>
#include <stdint.h>
#include <random>
#include <functional>
#include <ctime>

static std::mt19937 engine; // Mersenne twister MT19937

void print_n_random_bits (unsigned int n);

int main (void) {
engine.seed(time(0));
print_n_random_bits(64);
print_n_random_bits(63);
print_n_random_bits(62);
return 0;
}

void print_n_random_bits (unsigned int n)
{
uintmax_t max;

if (n == 8 * sizeof(uintmax_t)) {
max = 0;
} else {
max = 1;
max <<= n;
}
--max;

std::uniform_int_distribution<uintmax_t> distribution(0, max);

std::cout << n << " bits, max: " << max << std::endl;
std::cout << distribution(engine) << std::endl;
}

现在,进一步挖掘发现 std::mt19937_64 ,它具有正确的行为,但谁能向我解释为什么适用于 62 位数字的东西不适用于 64 位数字?

编辑:抱歉,我什至没有具体说明问题所在。 问题在于,对于 63 位和 64 位最大值,输出始终是 [0, 2**32 - 1] 范围内的数字。 ,例如:

% ./rand                       
64 bits, max: 18446744073709551615
1803260654
63 bits, max: 9223372036854775807
3178301365
62 bits, max: 4611686018427387903
2943926730538475327

% ./rand
64 bits, max: 18446744073709551615
1525658116
63 bits, max: 9223372036854775807
2093351390
62 bits, max: 4611686018427387903
1513326512211312260

% ./rand
64 bits, max: 18446744073709551615
884934896
63 bits, max: 9223372036854775807
683284805
62 bits, max: 4611686018427387903
2333288494897435595

编辑 2:我正在使用 clang++ ( Apple clang version 2.1 (tags/Apple/clang-163.7.1) ) 和“libc++”。我无法使用 GCC 轻松测试上述内容,因为我的版本没有 c++0x支持。

最佳答案

您在 libc++ 中发现了一个错误。谢谢!!!

我已对 143104 版本的树干尖端进行了以下修复:

Index: include/algorithm
===================================================================
--- include/algorithm (revision 143102)
+++ include/algorithm (working copy)
@@ -2548,7 +2548,7 @@
{
__u = __e_() - _Engine::min();
} while (__u >= __y0_);
- if (__w0_ < _EDt)
+ if (__w0_ < _WDt)
_S <<= __w0_;
else
_S = 0;
@@ -2561,7 +2561,7 @@
{
__u = __e_() - _Engine::min();
} while (__u >= __y1_);
- if (__w0_ < _EDt - 1)
+ if (__w0_ < _WDt - 1)
_S <<= __w0_ + 1;
else
_S = 0;

此修复不需要重新编译二进制 libc++.dylib。

关于c++ - 为什么 uniform_int_distribution<uintmax_t> 适用于 62 位数字但不适用于 63 或 64 位数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7917701/

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