Visual Studio C++ 2012 和 2017 在随机数生成中表现出不同的行为?
Visual Studio C++ 2012 & 2017 show different behaviour in random number generation?
i是在Visual Studio 2012(TC:11.0)(TC:11.0)和Visual Studio 2017(TC:14.1)下使用以下代码段从正态分布中取样的随机数:
#include "stdafx.h"
#include <iostream>
#include <random>
#include <cmath>
int main()
{
std::mt19937 e1;
std::mt19937 e2;
std::normal_distribution<> normal_dist(0, 1);
for (int n = 0; n<10; ++n) {
std::cout << "seq=" << e1();
std::cout << "; PRN=" << normal_dist(e2);
std::cout << std::endl;
}
return 0;
}
在VS12(TC:11.0)下,我收到以下结果:
seq=3499211612; PRN=0.253161
seq=581869302; PRN=-0.293219
seq=3890346734; PRN=0.0845901
seq=3586334585; PRN=-0.0570855
seq=545404204; PRN=0.992328
seq=4161255391; PRN=-1.43822
seq=3922919429; PRN=-0.910655
seq=949333985; PRN=0.106847
seq=2715962298; PRN=-0.600247
seq=1323567403; PRN=-0.844453
同样,在VS17(TC:14.1)下,我得到
seq=3499211612; PRN=-0.146382
seq=581869302; PRN=0.13453
seq=3890346734; PRN=-1.87138
seq=3586334585; PRN=0.46065
seq=545404204; PRN=-0.214253
seq=4161255391; PRN=0.163712
seq=3922919429; PRN=-0.827944
seq=949333985; PRN=0.298595
seq=2715962298; PRN=1.05547
seq=1323567403; PRN=0.0102154
我了解序列生成是独立的,而正态分布采样不是。该工具链依赖性的原因是什么?
非常感谢!
显然Microsoft更改了随机包含的某些实现。从某个时候从分布中绘制随机数时,需要一个均匀的分布样本。在工具链下14.1此任务的代码为:
_NRAND(_Eng, _Ty)
正如我发现的那样,Visual Studio 2012的工具链11.0和Visual Studio 2017的14.1为宏_NRAND
展示了不同的实现。该宏的目的是将从PRN引擎_Eng
绘制的整数值映射到间隔[0,1)。实施差异如下:
- 在Visual Studio 2012下,该序列的每个值通过提出序列的最小值并除以其最大值和最小值的差来重新缩放。 。
- 在Visual Studio 2017
_NRAND
下调用功能generate_canonical
。有关实现的详细信息,请参见随机参见第282 ff行。实际上,它是在序列的多个重新归属元素上计算某种多项式平均值。
相关文章:
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 我需要安装什么才能获得在Windows Server 2012 R2 Standard上运行C++hello world
- 使用Visual Studio 2012编译时,此代码会给我错误,但是使用代码块就可以了
- Windows 2012 R2 closesocket()挂在侦听套接字上
- 如何配置VS 2012的编译器来更改基本数据类型大小?
- 在 Visual Studio 2012 中未命中断点
- 在Windows Server 2012上运行VS2019编译的应用程序需要什么?
- C Visual Studio 2012 Express命令窗口怪异行为
- 堆损坏对 Windows 2012 r2 服务器的影响
- Visual Studio 2012静态图书馆与Visual Studio 2017
- 命名空间从VS 2017转换为2012年
- 如何将字符串形式的日期 ( "Dec 25, 2012" ) 转换为一组整数 (12/25/12)?
- 嵌套的C 常数数据结构,没有初始化列表或明确命名所有节点-VC 2012过早破坏了内部元素
- C 11魔术静态在Visual Studio 2012中的解决方法
- Visual Studio C++ 2012 和 2017 在随机数生成中表现出不同的行为?
- 在 Visual Studio 2012 中使用 "= delete" 时出现编译器错误
- Visual Studio (2012) 更改 dll 以导出类和变量
- 资源窗口在其他系统上无法正常工作 (Visual Studio 2012)
- C++函数中的内存泄漏,Visual Studio 2012,链表