2014-03-19 60 views
6

在功能相同的結果,我想生成數字的範圍列表: (此功能將在執行程序時,只能調用一次。)的std :: random_shuffle產生即使函數srand(時間(0))被調用一次

void DataSet::finalize(double trainPercent, bool genValidData) 
{ 
    srand(time(0)); 
    printf("%d\n", rand()); 

    // indices = {0, 1, 2, 3, 4, ..., m_train.size()-1} 
    vector<size_t> indices(m_train.size()); 
    for (size_t i = 0; i < indices.size(); i++) 
     indices[i] = i; 

    random_shuffle(indices.begin(), indices.end()); 
// Output 
    for (size_t i = 0; i < 10; i++) 
     printf("%ld ", indices[i]); 
    puts(""); 

} 

的結果是這樣的:

850577673 
246 239 7 102 41 201 288 23 1 237 

幾秒鐘後:

856981140 
246 239 7 102 41 201 288 23 1 237 

多:

857552578 
246 239 7 102 41 201 288 23 1 237 

爲什麼rand()正常工作的功能,但`random_shuffle」不?

+0

的可能重複【如何確保標準::隨機\ _shuffle總是會產生不同的結果?](http://stackoverflow.com/questions/6931951/how-to-make-sure-that-stdrandom- shuffle-always-produce-a-different-result) –

+0

在程序開始時,你只應該調用'srand()'一次。此外,請參閱[this](http://stackoverflow.com/questions/6926433/how-to-shuffle-a-stdvector-in-c)和[this](http://stackoverflow.com/questions/13459953/random-shuffle-not-really-random) –

+0

@JonathonReinhart,不是重複的,因爲他曾經叫過srand'。對? –

回答

5

random_shuffle()實際上並未指定使用rand(),因此srand()可能沒有任何影響。如果你想確定,你應該使用C++ 11格式之一random_shuffle(b, e, RNG)shuffle(b, e, uRNG)

另一種方法是使用random_shuffle(indices.begin(), indices.end(), rand());,因爲顯然您的random_shuffle()的實現不使用rand()

+5

是的,我強制random_shuffle使用'rand()',以便它正常工作。我使用'random_shuffle(begin(indices),end(indices),[](int n){return rand()%)來代替random_shuffle(indices.begin(),indices.end(),rand())' n;})'因爲前一個產生錯誤。我使用由macports安裝的cmake,並使用CXX標誌-std = C++ 11。我的g ++是clang-500.2.79,但我不知道cmake完全使用了什麼編譯器。 –

+0

@YangDawei:可以,例如,'消息( 「$ {} CMAKE_CXX_COMPILER」)'在'CMakeLists.txt'找出使用哪個編譯器。 – lisyarus

相關問題