11

私は 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_deviceColiruでは動かないようなので、代わりに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はここで賢いものではありませんか?

4

1 に答える 1