- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我很难理解为什么这段代码是尝试使用新的 <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/
作为documentation says : The effect is undefined if this is not one of short, int, long, long long, un
作为 documentation says : The effect is undefined if this is not one of short, int, long, long long, u
我创建了这个随机类,这样我就可以在需要时在游戏引擎中使用随机数,但是我遇到了函数问题,我想如何返回 R ? (请记住,我一般不熟悉编码) #pragma once #include #include
我有一个非常基本的问题,在浏览互联网后,我认为我做对了。我想使用 uniform_int_distribution 生成随机分布。 我的项目中有这段代码,使用 C++11 标准编译 uniform_i
在尝试运行我的代码后,我查阅了文档和示例,但无法找到将列表提供给 uniform_int_distribution 的方法。那这还不可能吗? 对于在不使用 srand() 或 rand() 的情况下从
对于单元测试,我实现了一个模拟随机数生成器。我相信这是 UniformBitGenerator 的有效实现(该 mock 实际上使用 google mock 来设置 operator() 的返回值,但
我是 C++ 的新用户,目前我正在 YouTube 上尝试制作 1d 控制台提示游戏的挑战;我正在努力做到这一点,以便我拥有具有不同伤害范围的武器,并且当控制台打开时,它会给出一个介于设定范围(例如
版本 3 将生成器移动到一个类中。这次我的新随机数生成技术正确吗? template class MyRandomGenerator { public: MyR
uniform_int_distribution 使用以下内容概率质量函数: P(i|a,b) = 1/(b-a+1), a <= i <= b 如何阅读等式的 LHS,即:P(i|a,b)? 最佳答
如何使用 uniform_int_distribution 作为构造函数中的类字段。我是++ 的新手。我正在尝试下一种方法,但遇到了错误。 class RandomConnectionsProvide
我有一个包含多个类的程序,其中一些需要随机 double 和整数。在其中一个类中,我定义了一个结构体来为随机引擎提供种子,并能够在需要时通过该结构体的对象生成随机实数和整数。带有类和结构声明的 .hp
使用 VS2013 时,std::uniform_int_distribution::operator() 似乎只需要 Generator 模板参数有一个 typedef ed result_type
我创建了一个实现 MersenneTwister 算法以生成伪随机数的类。我的问题是如何让我的生成器使用默认的 std::uniform_int_distribution?我类(class)的标题如下
我想从 n 个数字中随机选择一个整数,其中 n 很小(比如 5)。为此,我使用了 std::uniform_int_distribution。 分布的具体细节并不那么重要,但我希望结果是随机的并使用范
在标准库的至少一个实现中,第一次调用 std::uniform_int_distribution<> 不返回随机值,而是返回分布的最小值。也就是说,给定代码: default_random_engin
在标准库的至少一个实现中,第一次调用 std::uniform_int_distribution<> 不返回随机值,而是返回分布的最小值。也就是说,给定代码: default_random_engin
所以我有一个随机对象: typedef unsigned int uint32; class Random { public: Random() = default; Random(s
根据以下结果,使用 % 运算在两个数字之间生成均匀随机整数几乎比使用 std::uniform_int_distribution 快 3 倍:有什么好的理由使用 std::uniform_int_di
在 C++ 中,我们如何使 std::uniform_int_distribution 密码安全?例如,以下代码是否生成密码安全的均匀随机数?如果不是,我们该如何纠正呢? #include #inc
我有类似下面的代码: vector vec; // stuff vector here random_device rd; minstd_rand generator(
我是一名优秀的程序员,十分优秀!