Случайные числа в C ++ - PullRequest
       18

Случайные числа в C ++

0 голосов
/ 05 июня 2011

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

//Cards.h
#include <iostream>
#include <time.h>
#include <cstdlib>
using namespace std;

class Cards
{
      private:
      int val_seed,suit_seed;
      public:
      int val[10];
      string card[10];
      int dealcard(int x)
      {   
          srand(); 
          val_seed=rand()%13 + 2;
          suit_seed=rand()%4 + 1;
          if(val_seed>=1 && val_seed<=10)
          {
                  if(val_seed==10)
                  {
                                  card[x]="10";
                  }
                  else
                  {
                      card[x]=val_seed+48;
                  }
          }
          else if(val_seed>10)
          {
               switch(val_seed)
               {
                               case 11: card[x]="J"; val_seed=10; break;
                               case 12: card[x]="Q"; val_seed=10; break;
                               case 13: card[x]="K"; val_seed=10; break;
                               case 14: card[x]="A"; val_seed=11; break;
               }
          }
          switch(suit_seed)
          {
                           case 1: card[x]+='\3'; break;
                           case 2: card[x]+='\4'; break;
                           case 3: card[x]+='\5'; break;
                           case 4: card[x]+='\6'; break;
          }
          val[x]=val_seed;
      }

};
//main.cpp
#include <cstdlib>
#include <iostream>
#include "Cards.h"

using namespace std;

int main(int argc, char *argv[])

{
    Cards k;
    for(int a=1; a<=9; a++)
    {
            k.dealcard(a);
    }

    for(int e=1; e<=9; e++)
    {
            cout<<k.card[e]<<"("<<k.val[e]<<")"<<" ";
    }

    cout<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

Ответы [ 5 ]

11 голосов
/ 05 июня 2011

Семя числового генератора РАЗ. Если вы запустите свою функцию в цикле, они будут выполняться быстрее, чем интервал разрешения по времени (поэтому все начальные числа одинаковы и, следовательно, числа).

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

1 голос
/ 05 июня 2011

Проблемы с использованием srand(), несмотря на то, что алгоритм генерации вашей карты неверен.Даже возможность генерирования двух одинаковых карт подряд означает, что это неправильно.

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

1 голос
/ 05 июня 2011

См. http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

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

1 голос
/ 05 июня 2011

Вы не хотите звонить srand каждый раз, когда используете rand, просто позвоните один раз в начале программы, и все будет в порядке.

Вызов этого параметра с указанием времени в качестве параметра также гарантирует, что вы будете получать разные случайные последовательности при каждом запуске программы.

0 голосов
/ 05 июня 2011

Вы высеваете srand() с нуля; Начните с текущего времени и повторите попытку, чтобы решить вашу проблему.

time_t now;
time(&now);
srand((unsigned int)now);
...