std::piecewise_linear_distribution在VS2012下不工作
std::piecewise_linear_distribution not working under VS2012?
我决定更好地了解c++11 <random>
,所以我写了这样一段代码:
std::mt19937 gen(10);
std::piecewise_linear_distribution<> d(Range.begin(), Range.end(),
RangeValues.begin());
std::map<int, unsigned int> hist;
for (int n = 0; ++n != iterations;)
++hist[std::round(d(gen))];
for (auto p : hist)
std::cout << std::setw(2) << p.first << ": "
<< std::string(p.second/(iterations/200), '*') << 'n';
由于某种原因,std::random_device
似乎不能在Coliru上工作,所以我输入了一个const样本种子。我认为,这是UB因此IIRC它是基于硬件,这就是为什么它不支持Coliru(纠正我,如果我错了)。但在Ideone上,它确实可以工作。
然后我把它移植到VS2012上运行,唯一的区别是自己实现了std::round
:
return number < 0.0 ? std::ceil(number - 0.5) : std::floor(number + 0.5);
它在Coliru上完全正确,但是当我在VS2012上编译和运行它时,输出是错误的。
知道如何纠正这个,更重要的是,为什么会发生?我做错了什么,还是VS2012不是聪明的一个在这里?
看来这是Visual Studio的问题。我试过下面的程序(改编自OP), GCC 4.7.2, Clang 3.2和Intel 13.1.0生成的输出非常合理,而Visual Studio 11 2012 CTP生成的输出则完全不同。
概率密度是分段线性的,由数组x和p按如下方式定义。连接点(x[i], p[i])的分段线性函数,当i = 0,…,构建N(其中N = x.size() - 1)。然后将这个函数归一化(通过除以它的积分)得到概率密度。
#include <iostream>
#include <iomanip>
#include <string>
#include <random>
#include <array>
int main() {
std::mt19937 gen(10);
std::array<double, 3> x = {{0, 20, 40}};
std::array<double, 3> p = {{0, 1, 0}};
std::piecewise_linear_distribution<> dist(x.begin(), x.end(), p.begin());
std::array<int, 40> hist = {{0}};
for (size_t i = 0; i < 200000; ++i)
++hist[static_cast<size_t>(dist(gen))];
for (size_t n = 0; n < hist.size(); ++n)
std::cout << std::setfill('0') << std::setw(2) << n << ' ' <<
std::string(hist[n] / 200, '*') << std::endl;
std::cout << "nValues in interval [20, 21[ : " << hist[20] << std::endl;
}
在我们的例子中,多边形函数连接(0,0),(20,1)和(40,0)。因此,它的形状是一个底为40,高为1的等腰三角形,其面积为20。因此,概率密度f连接了(0,0),(20,1/20)和(40,0)。这意味着在区间[20,21]中,我们可以期望大约f(20) *(21 - 20) = 1/20 * 1 = 1/20的抽签结果。我们总共绘制了200,000个值,然后,我们可以期望在[20,21]中有大约10,000个点。
GCC, Clang和Intel在[20,21]中报告9734个点,并显示一个非常类似于等腰三角形的模式:
00 *
01 ***
02 *****
03 ********
04 ***********
05 **************
06 ***************
07 ******************
08 ********************
09 ************************
10 **************************
11 ****************************
12 *******************************
13 *********************************
14 ***********************************
15 ***************************************
16 *****************************************
17 ******************************************
18 **********************************************
19 ************************************************
20 ************************************************
21 *********************************************
22 *******************************************
23 *****************************************
24 **************************************
25 ************************************
26 **********************************
27 ******************************
28 ****************************
29 **************************
30 ***********************
31 ********************
32 ******************
33 ****************
34 *************
35 ***********
36 *********
37 ******
38 ***
39 *
Values in interval [20, 21[ : 9734
不幸的是,Visual Studio 11 2012 CTP给出了这个:
00 ********************************************** [truncated]
01 **********************************************
02 ***********************************
03 *****************************
04 **************************
05 ***********************
06 *********************
07 ********************
08 *******************
09 ******************
10 *****************
11 ****************
12 ***************
13 **************
14 **************
15 **************
16 *************
17 *************
18 *************
19 ************
20 ************
21 *************
22 *************
23 *************
24 *************
25 **************
26 ***************
27 ***************
28 ****************
29 *****************
30 ******************
31 *******************
32 *******************
33 *********************
34 ***********************
35 **************************
36 *****************************
37 ***********************************
38 **********************************************
39 ********************************************** [truncated]
Values in interval [20, 21[ : 2496
指出:
- 我截断了Visual Studio输出以便更好地显示。
- 对[20,21]中的点数的更好估计是200,000 * (0.5 * (f(20) + f(21))) *(21 - 20) = 100,000 *(1/20 + 1/20 - 1/400) = 10,000 - 250 = 9750。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 在 vs2012 中,lambda 中的 noexcept 如何工作?
- Clang+VS2013:包含c++标头时出错(vs2012:正在工作)
- 无法使用VS2012链接到静态升压库,而动态链接工作正常
- 通过值返回boost ublas矩阵,仅在vs2012的发布配置中工作
- 为什么"!="操作员在 C++ VS2012 中不为我工作
- std::piecewise_linear_distribution在VS2012下不工作
- BackgroundSubtractorMOG2在VS2012下工作,在ubuntu上失败
- 没有安装VS2012, c / c++ dll缺少依赖项.有了它,它工作得很好
- 元组在VS2012中是如何工作的