#c #class #random #numbers #blackjack
#c #класс #Случайный #числа #блэкджек #c
Вопрос:
Я создаю программу для игры в блэкджек. Я хочу, чтобы карты раздавались случайным образом. если я использую функцию 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 amp;amp; 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;
}
Комментарии:
1. В приведенном выше коде у вас есть
srand()
, который, я думаю, даже не будет скомпилирован. Как вы на самом деле это называете?2. srand() используется для заполнения функции rand.
Ответ №1:
Запустите генератор чисел ОДИН РАЗ. Если вы запустите свою функцию в цикле, они будут выполняться быстрее, чем интервал временного разрешения (таким образом, все начальные значения одинаковы и, следовательно, числа).
При разработке приложения и его отладке будет полезно, если вы зададите генератору одно и то же известное значение. Это означает, что последовательные сеансы отладки будут использовать одни и те же значения из генератора. Не забудьте переключиться обратно на начальное значение, основанное на времени (), в вашей сборке выпуска (или используйте предварительный процессор, чтобы определить, является ли это сборкой отладки или выпуска, и сделать это за вас).
Ответ №2:
Смотрите http://www.cplusplus.com/reference/clibrary/cstdlib/srand /
srand лучше всего инициализировать уникальным значением, например, временем, поскольку компьютеры не генерируют случайные числа, а фактически работают из предопределенного списка, это делает начальную точку менее определяемой.
Ответ №3:
Вы не хотите вызывать его srand
каждый раз при использовании rand
, просто вызовите его один раз при запуске программы, и все будет в порядке.
Вызывая его с параметром time в качестве параметра, вы также будете уверены, что при каждом запуске программы вы будете получать другую случайную последовательность.
Комментарии:
1. Ну, да. Это вроде как работает, но тогда это добавляет ненужную задержку
Ответ №4:
Несмотря на проблемы с использованием srand()
, ваш алгоритм генерации карт неверен. Даже возможность того, что он сгенерирует две одинаковые карточки подряд, означает, что это неправильно.
Вы должны взять колоду карт (52 или несколько кратных им), перетасовать ее, используя случайно сгенерированное начальное число, и раздать карты из перетасованной колоды.
Комментарии:
1. Я планирую добавить его позже. Но это все еще оставляет проблему «случайного начального числа». Я планировал добавить функцию для проверки, была ли уже сдана одна и та же карта, и если да, то вернуться и сдать другую.
Ответ №5:
Вы заполняете srand()
значением null; заполняете текущим временем часов, а затем повторяете попытку, это должно решить вашу проблему.
time_t now;
time(amp;now);
srand((unsigned int)now);
Комментарии:
1.
srand()
даже не компилируется, поэтому OP не дает нам правильный код. Этот ответ может быть правильным, но он / она уже говорит, что он / она делаетsrand(time(NULL))
.2. Он не компилируется ни под VS2010, ни под GCC 4.1.2! Смотрите также cplusplus.com/reference/clibrary/cstdlib/srand .