2016-09-20 5 views
0

Я использую эту функцию для генерации случайных перестановок цифр 0,1,2,3, которые переводится на перемещения агентами в двумерной сетке для игры Tron.Движения случайного агента C++ идентичны

srand(time(nullptr)); 
vector<int> permutationMoves = { 0, 1, 2, 3 }; 
auto currentIndexCounter = permutationMoves.size(); 
for (auto iter = permutationMoves.rbegin(); iter != permutationMoves.rend(); 
    iter++, --currentIndexCounter) { 
    int randomIndex = rand() % currentIndexCounter; 
    if (*iter != permutationMoves.at(randomIndex)) { 
     swap(permutationMoves.at(randomIndex), *iter); 
    } 
} 

Однако, у меня есть два вопроса:

  • Если два агента делают последовательные шаги, которые они делают то же самое движение из-за того, что случайное число зависит от времени.
  • Если агенты играют несколько раундов друг за другом, ходы обоих агентов идентичны ходам в предыдущей игре. Таким образом, сетка всегда одна и та же, и 1 агент в большинстве случаев выигрывает 95% -100% игр.

Вся помощь будет очень признательна, спасибо!

+0

Пожалуйста, вставьте код здесь. – amchacon

+2

Вызов 'srand()' один раз в начале программы, а не каждый раз в функции. – Barmar

+0

Я просто оставлю [это] (https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful) здесь ... –

ответ

5

Проблема заключается в:

srand(time(nullptr)); 

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

Удалите эту строку и поместите ее в начало программы.

+0

Спасибо! Это решило проблему. – Stefan1993

3

rand() и srand являются генераторами псевдослучайных чисел, поэтому вы можете генерировать случайные числа способом C++ 11.

std::random_device randomDevice; 
std::mt19937 generator(randomDevice()); 
std::uniform_int_distribution<> distribution(1, 100); 
int randNum = distribution(generator); 

Убедитесь, что вы #include <random>

+0

Я бы никогда не использовал 'std :: mt19937' в реальном приложении. Это слишком медленно, когда есть [PRNG с похожими или лучшими характеристиками] (http://www.pcg-random.org/), которые работают на порядки быстрее. Или просто придерживайтесь 'rand()' для вещей, где неравномерность случайности не имеет значения. – Cameron

+1

Примечание. Mt19937 также является генератором псевдослучайных чисел. –