このコードが<random>
ヘッダーをC++ 11で使用しようとしたときに[0, 2**62 - 1]
に正しく乱数を生成していますが、[0, 2**63 - 1]
または[0, 2**64 - 1]
では正しくない理由を理解できません。uniform_int_distribution <uintmax_t>は62ビット数では機能しますが、63ビットまたは64ビットでは機能しないのはなぜですか?
#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ビットの1のために動作しません、なぜ誰も私に説明できますか?
を編集してください。申し訳ありませんが、私は問題を特定しませんでした。 問題は、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のよ++ "私のバージョンはc++0x
をサポートしていないので、私は上記のGCCで簡単にテストすることはできません。
これはまさにそれが予期しないことですか?つまり、あなたの期待と異なる結果をあなたにどのくらい提示しているのですか? – andand
また、どの標準ライブラリ実装を使用していますか? – Fanael
多分ちょうど悪いことを考えてみてください:) – Dani