2016-03-25 16 views
-1

現在、ゲーム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の間の良いランダムシードを生成する良い方法はありますか?

+1

あなたは 'C++ 11を使用することはできません何らかの理由があります'とそれに付随する乱数生成器は? – Galik

+0

'rand()'が線形合同ジェネレータである場合、同様のシードで同様の初期値を与えることができます。その解決策は、ジェネレータを数十回実行することで、値がより大きくなるようにすることです。 –

+0

返事をお寄せいただきありがとうございます。 @ギャリック私はC++ 11に乱数ジェネレータがあったことを知らなかったので、私はそれらを調べます。 –

答えて

1

私はそうのように私に0と4294967295の間の値を与えるためにC++ 11一様分布乱数発生器を使用して終了:

std::default_random_engine generator; 
std::uniform_int_distribution<int> distribution; 
generator.seed(chrono::steady_clock::now().time_since_epoch().count()); 
random = distribution(generator); 
関連する問題