2016-04-22 18 views
2
#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <cstdlib> 


int main() { 
    std::vector<short> a(256); 
    for (short x = 0; x != 256; ++x) { 
     a[x] = x; 
    } 
    for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl; 
    std::cout << std::endl; 

    std::srand(11); 

    std::random_shuffle(a.begin(), a.end()); 
    for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl; 
    std::cout << std::endl; 

    for (short x = 0; x != 256; ++x) { 
     a[x] = x; 
    } 
    for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl; 
    std::cout << std::endl; 

    std::srand(11); 

    std::random_shuffle(a.begin(), a.end()); 
    for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl; 
} 

Also, hier ist mein Code. Was ich erwarte ist natürlich das gleiche Shuffle. Was ich bekomme, ist, während die Shuffles zwischen den Starts konsistent sind, sie sind unterschiedlich und scheinen srand zu ignorieren! Was mache ich hier falsch?std :: random_shuffle wird nicht gesetzt

Antwort

2

Beachten Sie, dass für std::random_shuffle, welcher Zufallsgenerator verwendet wird, Implementierung definiert ist, es wird nicht garantiert, std::rand zu verwenden.

Sie std::shuffle stattdessen verwenden könnte und es einen Zufallszahlengenerator passieren:

std::random_device rd; 
std::mt19937 g(rd()); 
std::shuffle(a.begin(), a.end(), g); 

LIVE

2

Bitte beachten Sie, dass die Version std::random_shuffle, die Sie verwenden, veraltet ist.

Beachten Sie auch (aus der vorherige Referenz Link)

... die Funktion std::rand wird häufig verwendet.

Das hier Stichwort oft zu sein und nicht immer .

Wenn Sie sicherstellen möchten, dass immer dieselbe Sequenz erstellt wird, sollten Sie eine der Alternativen verwenden, entweder eine bestimmte Zufallszahlfunktion übergeben oder die std::shuffle-Funktion verwenden, die einen Generator (aus C++ 11 "neu" PRNG classes).