С++ время и случайная функция

Я пытаюсь создать процедуру, которая случайным образом вытягивает карты из колоды. Проблема заключалась в том, что мне нужно было сделать процедуру розыгрыша фактически случайной, поскольку каждый розыгрыш одинаков при использовании srand и rand, когда никакие другие факторы не меняются. Таким образом, я привязал его к time_t секунд и смог сделать розыгрыш полуслучайным. Это потому, что мне нужно подождать секунду, чтобы параметр time_t секунд изменился. Причина, по которой это проблема, заключается в том, что моя программа запускается снова, если она вытягивает одну и ту же карту дважды (что, как известно, происходит). Таким образом, если он вытягивает одну и ту же карту дважды, он будет вынужден вытягивать еще примерно пятнадцать раз (или больше или меньше), пока не изменится второй параметр time_t. Есть ли способ измерить миллисекунды или другую меньшую единицу времени, чтобы у меня не было этой проблемы?

Вот код, хотя проверка на совпадение и организационные процедуры не прилагаются (в любом случае они происходят только после первоначального розыгрыша).

int allow = 0;
    string cards[] = 
    {"02hearts", "03hearts", "04hearts", "05hearts", "06hearts", "07hearts", "08hearts","09hearts", "10hearts", "11hearts", "12hearts", "13hearts", "14hearts",
     "02clubs", "03clubs", "04clubs", "05clubs", "06clubs", "07clubs", "08clubs", "09clubs", "10clubs", "11clubs", "12clubs","13clubs", "14clubs","14clubs", 
    "02spades", "03spades", "04spades", "05spades", "06spades", "07spades", "08spades", "09spades", "10spades", "11spades", "12spades", "13spades", "14spades",
    "02diamonds", "03diamonds", "04diamonds", "05diamonds", "06diamonds", "07diamonds", "08diamonds", "09diamonds", "10diamonds", "11diamonds", "12diamonds", "13diamonds", "14diamonds"};
    string cardHand [5];
    string cardnumbers [5];
    int cardInts [5];
    string handSuites [5];
    char handSuitesChar [5];





    //check deck
    while(allow == 0)
    {

    //set clock
    time_t seconds;

    time(&seconds);


    srand((unsigned int) seconds);

    int type;

    //initiate counters
    int n = 0;
    int n1 = 0;
    int n2 = 0;
    int n3 = 0;
    int n4 = 0;

    //draw cards
    while(n < 5)
    {
        type = rand() % 52;
        cardHand[n] = cards[type];
        cout << cardHand[n] << ", ";
        n++;
    }


    cout << endl;

    //pull numbers from cards
    while(n1 < 5)
    {
        string character2;
        cardnumbers[n1] = cardHand[n1].at(0);
        character2 = cardHand[n1].at(1);
        cardnumbers[n1].append(character2);
        cout << cardnumbers[n1] << ", ";
        n1++;
    }
    cout << endl;
    cout << endl;


    //convert numbers to ints
    while(n2 < 5)
    {
        stringstream convert(cardnumbers[n2]);

        if( !(convert >> cardInts[n2]))
            cardInts[n2] = 0;

        cout << cardInts[n2] + 100 << ", ";

        n2++;
    }

    cout << endl;

    //pull out first letters for suites
    while (n3 < 5)
    {
        handSuites[n3] = cardHand[n3].at(2);

        cout << handSuites[n3]<< endl;
        n3++;
    }


    //convert letters to chars
    while (n4 < 5)
    {
        stringstream convert(handSuites[n4]);

        if( !(convert >> handSuitesChar[n4]))
            handSuitesChar[n4] = 0;

        cout << handSuitesChar[n4] + 100 << ", ";
        n4++;
    }

person David    schedule 12.12.2012    source источник
comment
Не рисуйте их хаотично. Перетасуйте колоду и вытяните их по порядку. См. этот пример с использованием std::random_shuffle.   -  person Robᵩ    schedule 13.12.2012


Ответы (2)


Не вызывайте srand() внутри цикла. Вызовите его один раз в начале вашей программы, а затем просто используйте rand() всякий раз, когда вам нужно случайное число. Это даст вам довольно длинную псевдослучайную последовательность.

person NPE    schedule 12.12.2012

Как заметил Роб, проблема не в rand(), а в том, как вы тянете карты. Нет причин каждый раз брать одну и ту же карту дважды. Вы можете использовать предложение Роба и перетасовать колоду, или вы можете выбрать случайную карту из неперетасованной колоды, а затем удалить ее из колоды (поменять местами с концом, затем pop_back), чтобы ее нельзя было взять снова.

И, конечно же, никогда не запускайте генератор более одного раза в одном процессе.

person James Kanze    schedule 12.12.2012