我試圖使用std::uniform_real_distribution<float>(a, b)
來產生隨機浮點數,並且我發現輸出等於上限b
的情況。根據: http://www.cplusplus.com/reference/random/uniform_real_distribution http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution 這不應該發生。統一實際分佈的C++錯誤?
與這兩個gcc-4.9.2
和clang-3.5.0
,對我下面的崩潰:
#include <iomanip>
#include <iostream>
#include <limits>
#include <random>
int main() {
float a = 1.0f;
float b = 1.001f;
size_t seed = 293846;
size_t n = 9830;
std::mt19937 rg(seed);
std::uniform_real_distribution<float> u(a, b);
for (size_t i = 0; i < n; ++i) {
float v = u(rg);
if (not (v < b)) {
std::cerr << "error: i=" << i
<< " v=" << std::scientific << std::setprecision(std::numeric_limits<double>::max_digits10) << v
<< " b=" << b << std::endl;
abort();
}
}
}
我看到的輸出是:
error: i=9829 v=1.00100004673004150e+00 b=1.00100004673004150e+00
Aborted (core dumped)
這是與標準庫中的錯誤?我錯過了什麼嗎?
編輯。雖然不是完全重複的,但在這個問題中提出的問題確實包含在這裏引用的其他問題的答案中。
最翔實的關於這個問題的狀態是LLVM錯誤線程在這裏:https://llvm.org/bugs/show_bug.cgi?id=18767
不是每天我都看到一個C程序員用'not'而不是'!'; –
@Lapshin:我對這個練習有分歧意見。一方面,關鍵字邏輯很好,但另一方面,十年不使用它們使得它們顯得不合適。 – Hurkyl
@Hyrkyl我不反對,實際上就像這裏它更可讀,但仍然。 –