2013-06-04 2 views
0

У меня есть простая программа, которая до сих пор создает 5 общих карт (все ints). Мне удалось установить их (и они являются глобальными переменными, это специально), но каждый раз, когда я запускаю программу, они создают одинаковый номер. Ниже приведен код.rand() не создает случайные числа

int communityCards[5]; 
int playerCards[2]; 
int opponentCards[2]; 
int communityValues[5]; 
int playerValues[2]; 
int opponentValues[2]; 

int main(int argc, const char * argv[]) { 
    for (int i = 0; i < 9; i++) { 
     if (i < 5) { 
      communityCards[i] = rand() % 52 - i; 
      for (int a = 0; communityCards[a]!=0; a++) { 
       communityCards[i]==communityCards[a]?communityCards[i]++: a = a; 
      } 
     } 
     printf("%i ", communityCards[i]); 
    } 
} 
+0

просто проверить руководство. вы должны сначала вызвать 'srand'. –

+1

Вы должны начать использовать более новый случайный генератор. http://www.cplusplus.com/reference/random/uniform_real_distribution/uniform_real_distribution/ – dchhetri

+0

@ user814628 - это не изменит поведение, не затрачивая генератор. Программа будет по-прежнему производить одинаковый набор значений для каждого прогона. –

ответ

3

Вы хотите назвать srand(time(NULL)); один раз в начале main.

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

Обычно вы хотите заполнить колоду, перетасовать ее с std::random_shuffle, затем переместите карты оттуда в сообщество, руки игрока и противника.

+0

«время» имеет точность в 1 секунду, поэтому сразу несколько экземпляров выдают одинаковый результат. – SigTerm

+0

@SigTerm: стандарт C++ не указывает точность 'time'. 1 секунда распространена, но это может быть наносекунда или час. –

+0

@JerryCoffin, Wow, я никогда не слышал этого раньше. Я не сталкивался с тем, что кто-то требовал ничего, кроме одной секунды до сих пор. Полезно знать, спасибо. – chris

3

Использовать srand только один раз с надлежащим семенем перед вызовом rand. Обычно используется srand(time(0)).

В качестве альтернативы, C++ 11 обеспечивает намного лучшее качество random number generators с мелкозернистыми характеристиками (rand в основном не гарантирует качество номеров, которые он производит).

2

записи srand FUNC в начале вашей программы Он будет принимать текущее время в качестве семян

int main() 
{ 
    srand(time(0)); 

    // STUFF 
} 
Смежные вопросы