- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对以下代码有疑问:
#include <cassert>
#include <limits>
#include <random>
int main() {
using T = long double;
std::mt19937 engine{ std::random_device{}() };
const auto max = std::numeric_limits<T>::max();
const auto res = std::uniform_real_distribution<T>(0., max)(engine);
assert(res < max);
}
此代码可以作为独立程序正确执行。不幸的是,在瓦尔格朗德统治下,这一主张未能得到满足。仅对于
T == long double
会出现问题,即
double
和
float
情况不成问题。
最佳答案
这里的问题是Valgrind不完全支持long double
。手册reads:
Valgrind has the following limitations in its implementation of x86/AMD64 floating point relative to IEEE754.
There is no support for 80 bit arithmetic. Internally, Valgrind represents all such "long double" numbers in 64 bits, and so there may be some differences in results. ...
int main() {
auto max = static_cast<long double>(std::numeric_limits<double>::max());
std::cout << std::hexfloat << max << std::endl;
}
如果在Valgrind下独立运行,则输出是相同的:
0xf.ffffffffffff8p+1020
现在,让我们尝试通过添加以下行来打印下一个可表示的值
max = std::nextafter(max, std::numeric_limits<long double>::max());
在没有Valgrind的情况下,我们得到了预期的输出,但是在Valgrind下得到了不同的输出:
0xf.ffffffffffff801p+1020 // no Valgrind
0xf.ffffffffffff8p+1020 // under Valgrind
如果我们尝试打印
std::numeric_limits<long double>::max()
值本身,则会观察到类似的不一致:
0xf.fffffffffffffffp+16380 // no Valgrind
0x8p+16381 // under Valgrind
难怪
std::uniform_real_distribution<long double>
会以某种依赖于实现的方式通过
std::numeric_limits<long double>::max()
失败。
关于c++ - 在Valgrind下T == long double的std::uniform_real_distribution <T>和std::numeric_limits <T>::max()出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63120330/
我正在运行以下函数,它使用 Visual Studio 2012 为我提供范围 [low, high] 之外的值(我得到的随机数结果高于我给出的最高值 - 例如 1.8848149390180773范
我试图在我的项目中生成 (0,1) 范围内的高质量随机数,我尝试从 here 的示例代码中测试 uniform_real_distribution .当我运行它时,代码运行良好,但是当我尝试通过播种生
请帮助我理解这一点。运行代码段后: random_device randomEngine; mt19937 generatorEngine(randomEngine()); uniform_real_
我是 C++ 的初学者,我正在尝试探索 C++11 的特性。在这里,我试图熟悉新的随机性生成引擎。 我从关于这个主题的教程中总结了以下代码,我注意到两件事: 1- uniform_real_distr
我使用 default_random_engine 生成了一个不同数字的列表,但它们恰好是相同的。我想知道生成不同的数字?我知道 srand() 会。但是我可以使用这个默认引擎吗? default_r
我想创建一个 std::uniform_real_distribution 能够生成 [MIN_FLOAT, MAX_FLOAT] 范围内的随机数。以下是我的代码: #include #includ
我目前正在研究重要性抽样,出于测试目的,我需要能够生成 uniform_real_distribution 的所有可能值可能会在区间 [0,1] 内生成(是的,它也从右侧关闭)。我的想法是生成整数,然
我正在尝试寻找一种有效的方法来实现统一 (0,1) 分布。由于我必须生成大量样本,因此我选择了 mt19937 作为引擎。我正在使用 boost 库中的版本。我的问题是:使用引擎本身的输出与使用 un
我很惊讶地看到这个程序的输出: #include #include int main() { std::mt19937 rng1; std::mt19937 rng2; s
我正在使用正方形生成坐标列表 #include using namespace std; int main(){ random_device rd; long int seed = rd(); de
C++11 std::uniform_real_distribution( -1, 1 ) 给出 [-1,1] 范围内的数字。 如何获得 [-1,1] 范围内的均匀实数分布? 实际上这可能无关紧要,但
在运行下面的代码时,arr 的前半部分等于后半部分。为什么?我什至尝试了各种种子,例如std::chrono::system_clock::now().time_since_epoch().count
在我的程序中,我使用 uniform_real_distribution() 生成 0 到 1 之间的均匀随机数 #include default_random_engine e; uniform_
我正在为蒙特卡罗模拟编写 C++ 代码。因此,我需要生成许多均匀分布在 [0,1) 之间的数字。我包含了以下取自 here 的代码生成我的号码: // uniform_real_distributio
我写了这段代码: std::pair, size_t> NodeSelector::rouletteWheel() const { const std::uniform_real_distri
#ifndef _RNG_H #define _RNG_H #include class RNG { public: RNG() : _generator(_default_seed)
我正在尝试使用 c++0x 编译我的第一段代码。我很擅长 C++,但是这个让我难住了。以下将不会编译: #include #include int main() { unsigned
以下代码在 x86 32 位和 64 位处理器上产生不同的输出。 应该是这样的吗?如果我将它替换为 std::uniform_real_distribution 并使用 -std=c++11 进行编译
为什么 std::uniform_real_distribution 比 rand() 作为随机数生成器更好?有人可以举个例子吗? 最佳答案 首先,应该明确提出的比较是荒谬的。 uniform_rea
考虑以下最小示例: #include #include int main (const int argC, char* argV[] ) { std::uniform_real_distr
我是一名优秀的程序员,十分优秀!