2016-05-04 62 views
-2

我試圖洗牌vector的內容。 vector排序後,內容將被轉移到隊列中。隊列表示一副牌。我遇到的問題是,即使關閉該程序,我也會持續收到相同的結果。事實上,即使在關閉IDE之後,我也會得到相同的序列。換句話說,卡片洗牌一次,無論如何都保持順序。我曾嘗試過使用這種隨機化內容的新方法,但不得不訴諸舊方法。我希望能夠一勞永逸地解決這個問題。如果沒有辦法做到這一點,我的下一個問題將是如何隨機化內容,同時仍然使用std::shuffle。我也嘗試auto engine = std::default_random_engine{};只獲得相同的結果。謝謝。使用std :: random_device洗牌卡片

std::vector<string> v; 

    map<string, int>::const_iterator iter; 
    for (iter = cards.begin(); iter != cards.end(); iter++) { 
     v.push_back(iter->first); 
    } 

    std::random_device rd; 
    std::mt19937 g(rd()); 

    //auto engine = std::default_random_engine{}; 
    std::shuffle(v.begin(), v.end(), g); 

    std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, " ")); 
    std::cout << "\n"; 
+1

Downvoted由於缺乏研究工作。人們很難讀懂任何有關文件的文件。像'mt19937'沒有了解這裏有什麼問題,並且搜索*「Seed mt19937 C++」*也給每個搜索引擎都帶來了不錯的結果。 –

+0

我用不同的整數播種mt19937,看看有沒有什麼改變。我無意中在這裏發佈了這些代碼。我已經通過使用rd接種mt19937來修復代碼,這是預期的實現。 std :: random_device是一個隨機種子嗎? –

+0

這甚至沒有編譯。不,「std :: random_device」不是種子,雖然它可以用來獲取一個。請閱讀[docs](http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine)。 –

回答

0

我決定採取以下解決方案,因爲它符合我的一般要求。

vector<string> vect; 

    map<string, int>::const_iterator imap; 
    for (imap = cards.begin(); imap != cards.end(); imap++) { 
     vect.push_back(imap->first); 
    } 

    srand(std::time(0)); 
    random_shuffle(vect.begin(), vect.end()); 

    vector<string>::const_iterator ivect = vect.begin(); 
    while (ivect != vect.end()) { 
     deck.push(*ivect); 
     ivect++; 
    } 

    std::copy(vect.begin(), vect.end(), std::ostream_iterator<string>(std::cout, " ")); 
    std::cout << "\n"; 

這裏我使用std::random_sufflesrand(std::time(0));設置種子。這允許每次都有一個獨特的序列。