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, 1
    

    Auch 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)?


  • Mod

    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.

    d2 sollte 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!


Anmelden zum Antworten