uniform_int (Default-Grenzen)
-
Ich habe folgendes Problem bei der Verwendung von uniform_int:
Das Programm
#include <iostream> #include <limits> #include <random> int main(){ std::uniform_int<int> d1(0,5); std::uniform_int<int> d2(0, std::numeric_limits<int>::max() ); std::uniform_int<int> d3(0, std::numeric_limits<int>::max()-1 ); std::uniform_int<int> d4; std::random_device engine; for(int i=0;i<20;i++) std::cout << d1(engine) << ", " << d2(engine) << ", " << d3(engine) << ", " << d4(engine) << std::endl; return 0; }erzeugt (beispielsweise):
4, 187814261, 102652988, 3 2, -648718276, 1679202299, 6 2, 1372624328, 765237345, 5 3, -1540032838, 797276814, 9 1, -771150835, 474634352, 7 2, 1377803294, 1033337517, 9 0, 1873334337, 41097559, 7 1, 883776287, 949191094, 3 5, 1861892312, 347015643, 6 4, -1830732994, 1594757603, 8 1, 34938031, 1754090444, 6 0, -531933977, 369957329, 9 4, 1617876776, 1088135942, 8 5, -1513411046, 166204414, 7 3, -858987703, 1217361698, 4 3, 104777878, 1988711095, 4 4, -1210357411, 832529763, 1 5, 1566511073, 1541628068, 3 2, 1504092888, 868577866, 1 2, 1270818533, 2047213062, 1Auch bei weiteren Versuchen liefert
d1 (wie erwartet) Zahlen zwischen 0 und 5,
d2 (wie nicht erwartet) auch negative Zahlen,
d3 (wie erwartet) "große" Zahlen und
d4 (wie nicht erwartet) Zahlen zwischen 0 und 9.Liegt der Fehler bei mir oder bei meinem Compiler (g++ 4.4.4, -std=c++0x)?
-
1. Ok.
2. Hmm, vermutlich irgendein Überlauf, sehe gerade aber selber nicht wo
3. Ok.
4. Das soll so sein, Defaultparameter sind 0 und 9.
-
SeppJ schrieb:
1. Ok.
2. Hmm, vermutlich irgendein Überlauf, sehe gerade aber selber nicht wo
3. Ok.
4. Das soll so sein, Defaultparameter sind 0 und 9.d2sollte nur positiv sein. Alles andere ist so korrekt.
-
SeppJ schrieb:
4. Das soll so sein, Defaultparameter sind 0 und 9.
Gibt es da einen Unterschied zu uniform_int_distribution? (Ich dachte, das sei im wesentlichen das gleiche und nur der Name sei abgeändert worden).
Im C++0x-Draft, Version N3242, steht (26.5.8.2.1) steht:
// constructors and reset functions explicit uniform_int_distribution(IntType a = 0, IntType b = numeric_limits<IntType>::max()); explicit uniform_int_distribution(const param_type& parm);
-
Das ist ein gcc-Bug, der im Juni 2010 behoben wurde. Der Fix ist in gcc 4.6 enthalten.
uniform_int heißt inzwischen übrigens uniform_int_distribution, wie es C++11 verlangt.
-
seldon schrieb:
Das ist ein gcc-Bug, der im Juni 2010 behoben wurde. Der Fix ist in gcc 4.6 enthalten.
Vielen Dank für den Hinweis!