2016-09-20 4 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); 
        } 
    } 
    

    はしかし、私は2つの問題を抱えています。

  • エージェントが互いの後に複数のラウンドをプレイする場合、両方のエージェントの移動は前のゲームの移動と同じです。だから最終的にグリッドは常に同じで、1人のエージェントがほとんどの場合ゲームの95%-100%を獲得することになります。

すべてのサポートに感謝します。あなたはシードたびにresetingている

srand(time(nullptr)); 

:中

+0

、ここにコードを貼り付けてくださいことを確認してください。 – amchacon

+2

関数の中ではなく、プログラムの先頭で 'srand()'を1回呼び出します。 – Barmar

+0

私はちょうど[this](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'を使用しません。より速いオーダーを実行する[類似またはより良い特性を持つPRNG](http://www.pcg-random.org/)がある場合、それは非常に遅いです。あるいは、不均一なランダム性が重要でないものについては、 'rand()'を使ってください。 – Cameron

+1

注:mt19937は擬似乱数ジェネレータでもあります。 –

関連する問題