現在、ゲームSokobanのレベル生成プログラムを作成中です。私はrand()関数を使って各レベルを生成していますが、ユーザーが生成に使用するシードを制御できるというのは素晴らしい機能だと思っていました。ジェネレータは同じレベルを生成します。srand()に与えるランダムな種を生成する - 時間がない(NULL)
私は正常に動作し、私のプログラムは、同じシード問題なく同じレベルを生成します種子を生産するために
srand(std::time(NULL));
を使用してきました。しかし、std :: time(NULL)はミリ秒単位でシステム時間を返しますので、それは非常に興味深い、または多様な数字を与えません。つまり、1476894985が生成され、次のシードは1476897904です。
もっと面白い私は、次のコードを使用して0と9999999999の間でランダムシードを作成しようとした種:
typedef unsigned long long ull;
SokoGenerator::ull SokoGenerator::randomNumber(ull min, ull max, int divisor){
ull number = rand() % (max - min + 1)+ min;
while(number % divisor != 0){
number = rand() % (max - min + 1) + min;
}
return number;
}
srand(std::time(0));
genSeed = randomNumber(0, 999999999); }
srand(genSeed);
//Generate Levels After this point
しかし、これは、彼らが今、多くの小さい除い45789、46389、47958.
すなわち、同様の結果をもたらすように思われますsrand()関数に与える0と9999999999の間の良いランダムシードを生成する良い方法はありますか?
あなたは 'C++ 11を使用することはできません何らかの理由があります'とそれに付随する乱数生成器は? – Galik
'rand()'が線形合同ジェネレータである場合、同様のシードで同様の初期値を与えることができます。その解決策は、ジェネレータを数十回実行することで、値がより大きくなるようにすることです。 –
返事をお寄せいただきありがとうございます。 @ギャリック私はC++ 11に乱数ジェネレータがあったことを知らなかったので、私はそれらを調べます。 –