2017-05-30 2 views
0

Visual StudioでOpenGLとC++を使用して地形のような森を作りたいと思っています。当然のことながら、木や茂みなどのオブジェクトをランダムに配置して、より自然に見えます。私はrand()関数を使ってこれをやりたかったのですが、プログラムを実行している間にオブジェクトを使用して、場所が絶えず変化しています。私はプログラムがループしているので、rand()がその通りに動作していることが分かります。私はあなたに、これに代わる良い選択肢があるかどうか聞いてみたかったのです。私はちょうど彼の作成時に各オブジェクトのランダムな位置の値を取得し、その値は一定のままにしたい。この問題を抱えているコードの一部です:OpenGL C++ランダム値を取得するにはどうすればよいですか?

for (int i = -5.0; i < 5.0; i++){ 
    for (int j = -5.0; j < 5.0; j++){ 
     double k = i * 10.0 + ((rand() % 20 + 10) + ((rand() % 8 + 1)/10.)); 
     double l = j * 10.0 + ((rand() % 20 + 10) + ((rand() % 8 + 1)/10.)); 
     if (i % 2 == 0 && j % 2 == 0) 
     { 
      drvo(k, l); 
     } 
    } 
} 

私が得意とするものは何ですか?

+2

ランダムな位置を取得するためにrand()を呼び出し、(フレームごとにすべてのオブジェクトに対してrand()をもう一度呼び出すのではなく)その場所の値をどこかに保存してください。そうすれば、あなたのオブジェクトはランダムに配置されますが、同じ場所にとどまります。 –

+1

C++のstd :: uniform_real_distribution を試してみてください。はこちらです。https://stackoverflow.com/questions/19665818/generate-random-numbers-using-c11-random-library –

+0

@JeremyFriesner、私はいません私はあなたをかなり理解していると思います。私はシーンをレンダリングする関数の外にいくつかの行を追加しました: ' int c = rand()%20; int a = c; int d = rand()%10; ; INT B = D ' およびコードを少し変更のための: ' を(INT I = -5.0; iは<5.0; I ++){ ため\t \t(INT J = -5.0; J <5.0。 j ++){ \t \t \t double k = i * 10.0 + a + 10 +(b + 1)/ 10。 \t \t \t double l = j * 10.0 + b + 10 +(a + 1)/ 10。 \t \t \t IF(I%2 == 0 && jの%2 == 0) \t \t \t { \t \t \t \t drvo(K、L)。 \t \t \t} \t \t} \t} ' それは常に同じ値をロードするため、この方法では動作しません。私はある時点であなたを誤解したと確信しています。 – Daelendil

答えて

1

randは完全にランダムではありません。擬似ランダムです。同じシードの場合は、randと同じ値が生成されます。

srandを使用して、後で使用するために保存するシードをPRNGにシードすることをお勧めします。

シーンを再度レンダリングする場合は、保存したシードでsrandに再度コールし、randコールのシーケンスで同じ結果が得られるはずです。

+0

私が間違っている場合は私を訂正してください。しかし、私が理解するように、すべてのコンピュータ生成番号は疑似乱数です。すべての乱数生成アルゴリズムはあらかじめ定義されており、既知の入力で動作するためです。 – cse

+0

本当に乱数を生成するコンピュータはありません。コンピュータは決定論的であり、ランダムを生成するためのアルゴリズムは実際には循環的な数列を生成する(悪い発生器との差異はそれらのサイクルの長さである)。ランダム性の本当の原因は、一般的ではなく、使いやすいものでもありません(良いものは放射性物質によって与えられます)。 –

+0

私の答えはそれと矛盾していません。プログラミングの設定では、ランダム性に頼っている場合(例えば、ギャンブル、暗号化など)、エントロピーソースを慎重に選択する必要があります。 RNGの入力としてエントロピーを生成できるようにする市販のデバイスがあります。 – arboreal84

関連する問題