Ich sehe ein seltsames Verhalten mit der C++ 11 std::uniform_real_distribution
Kompilierung mit Apple LLVM Version 7.0.2 (clang-700.1.81). Durch Aufruf von operator() werden Ergebnisse außerhalb des Verteilungsbereichs gerendert. Das minimale Beispielprogramm reproduziert unter der MüheOS X libC++ std :: uniform_real_distribution Bug
// 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;
}
}
Kompilieren und Ausführen online (vermutlich mit g ++) macht vernünftige Ergebnisse
-1 1
-0.529254
-0.599452
0.513316
-0.604338
jedoch Kompilieren und lokal macht unvernünftig Ergebnisse ausgeführt wird.
-1 1
130349
37439.4
42270.5
45335.4
Habe ich etwas übersehen oder habe ich einen Fehler in libC++ festgestellt? Wenn Letzteres der Fall ist, ist sich jemand einer Arbeit bewusst?
Scheint wie ein Fehler für mich. Es hat mit der Wahl der Werte für "a", "c" und "m" zu tun. Es funktioniert gut für die meisten populären Wahlen, die [hier] aufgelistet sind (https://en.wikipedia.org/wiki/Linear_congruential_generator), aber scheitert für jene zwei Einstellungen, die 'm = 2^48' –