2016-09-20 5 views
0

이 함수를 사용하여 게임 Tron의 2 차원 격자에서 에이전트에 의해 이동하도록 0,1,2,3 숫자의 무작위 순열을 생성합니다. 때문에 임의의 숫자가 시간에 따라 달라진다는 사실에 두 개의 에이전트가 연속 이동을 한 경우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 %를 획득하게됩니다.

모든 도움을 주실 수 있습니다. 감사합니다. 당신은 씨앗마다 다시 설정하라는된다

srand(time(nullptr)); 

:에

+0

, 여기에 코드를 붙여주세요 있는지 확인합니다. – amchacon

+2

프로그램 시작시''srand()를 한 번만 호출하십시오. – Barmar

+0

여기 [https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful] 여기에 남겨 두겠습니다 ... –

답변

5

문제입니다. 2 통화 간 시간이 짧으면 동일한 난수가 생성됩니다.

해당 줄을 제거하고 프로그램의 처음에 넣습니다.

+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'을 절대로 사용하지 않겠습니다. 훨씬 더 빠르게 진행되는 [비슷하거나 더 우수한 특성을 지닌 PRNGs] (http://www.pcg-random.org/)가있을 때 그것은 너무 느립니다. 또는 불균등 한 임의성이 중요하지 않은 경우에는'rand()'를 사용하십시오. – Cameron

+1

참고 mt19937 또한 의사 난수 생성 프로그램입니다. –