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

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

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

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++;
}

1

Решение

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

4

Другие решения

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

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

0

По вопросам рекламы [email protected]