2016-05-04 2 views
-2

Я пытаюсь перетасовать содержимое vector. После сортировки vector содержимое будет перенесено в очередь. Очередь представляет колоду карт. Проблема, с которой я сталкиваюсь, заключается в том, что я постоянно получаю те же результаты, даже если я закрываю программу. Фактически, я получаю такую ​​же последовательность даже после закрытия IDE. Другими словами, карты перетасовываются один раз и остаются в этом порядке, несмотря ни на что. Я пробовал использовать этот новый метод рандомизации содержимого раньше и должен был прибегнуть к старому методу. Я надеюсь окончательно решить эту проблему раз и навсегда. Если этого не сделать, мой следующий вопрос заключается в том, как рандомизировать содержимое, используя std::shuffle. Я также попробовал auto engine = std::default_random_engine{}; только для получения тех же результатов. Благодарю.Shuffle колода карт с использованием 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

Сокращенный из-за отсутствия исследовательских усилий. Невозможно прочитать какую-либо документацию о чем-л. например, 'mt19937', не узнав, что здесь не так, и поиск *« Seed mt19937 C++ »* дает достойные результаты для каждой поисковой системы. –

+0

Я посеял mt19937 с разными целыми числами, чтобы увидеть, что-нибудь изменится. Я случайно разместил этот код здесь. Я исправил код путем посева mt19937 с rd, который является предполагаемой реализацией. 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_suffle и установка семян с srand(std::time(0));. Это позволяет создавать уникальную последовательность каждый раз.

Смежные вопросы