- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在使用 C++ 11 的 std::uniform_real_distribution
编译 Apple LLVM 版本 7.0.2 (clang-700.1.81) 时看到了一些奇怪的行为。调用 operator() 会呈现超出分布范围的结果。下面的最小示例程序重现了这个问题
// Example program
#include <random>
#include <iostream>
#include <string>
template< int power >
constexpr uint64_t power_of_two(){
return 2 * power_of_two< power - 1 >();
}
template< >
constexpr uint64_t power_of_two< 0 >(){
return 1;
}
std::linear_congruential_engine
< uint64_t, 273673163155, 13, power_of_two< 48 >() >
rng;
std::uniform_real_distribution< double > angle_cosine(-1, 1);
int main()
{
std::cout << angle_cosine.a() << " " << angle_cosine.b() << '\n' << std::endl;
for (int i = 0; i < 4; ++i){
std::cout << angle_cosine(rng) << std::endl;
}
}
编译运行online (大概使用 g++)呈现合理的结果
-1 1
-0.529254
-0.599452
0.513316
-0.604338
但是在本地编译运行会出现不合理的结果。
-1 1
130349
37439.4
42270.5
45335.4
我是不是忽略了什么或者我遇到了 libc++ 中的错误?如果是后者,是否有人知道解决方法?
最佳答案
这是 LLVM 线性同余生成器中的错误,而不是均匀实数分布中的错误。均匀实数分布假定生成器返回的数字介于生成器的最小值和最大值之间(含)。这是任何生成器的要求。具有这组数字的 LLVM 线性同余生成器无法满足该要求。
LLVM 线性同余生成器使用称为 Schrage 算法的旧算法来避免溢出,而不是用于您的数字集的 (a*x+c)%m
。该算法的 LLVM 实现实际上保证了您的 a, c, m
集将生成大于 m
的数字。
您可以在此处查看 LLVM 代码:https://llvm.org/svn/llvm-project/libcxx/trunk/include/random .搜索“施拉格算法”。您选择的 a
、c
和 m
会调用该术语的四次出现中的第一次。
顺便说一下,您的代码中也有一个错误。那些魔数(Magic Number) 273673163155 和 13 应该是以 8 为底数。这些是 drand48
使用的数字。随机选择 a
、c
和 m
的值几乎肯定会导致错误的随机数生成器。
我建议切换到 std::mt19937
或 std::mt19937_64
。
关于c++ - OS X libc++ std::uniform_real_distribution 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37382139/
我正在运行以下函数,它使用 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
我是一名优秀的程序员,十分优秀!