確定的であるランダムに見えるアイテムの配置?


7

私は横スクロールゲームに取り組んでおり、背景の森を生成したいと考えています。品質が同じであることを確認するために、すべての人の背景を同じにしてください。シードされた乱数ジェネレーターにもアクセスできないため、適切なシードを見つけてそこから移動できません。

アイデア?


7
シードされた乱数ジェネレータにアクセスできないのはなぜですか?

これはゲームメーカーのようなプログラムで、プログラムはありません:(

4
シードされた乱数ジェネレーターを提供していないゲームメーカーは何ですか?変。

7
使用しているエンジンでタグ付けすると、回答をより具体的にすることができます。
Martin Sojka、2011

回答:


15

最も明白な方法は、おそらく独自の乱数ジェネレータを作成することでしょう。特に、ランダム性について特に高い基準を満たす必要がないため(明らかに見えるパターンがないだけ)、半ダース以下のコードでかなり合理的なパターンを書くのは非常に簡単です。

必要に応じてオブジェクト密度を同じにする引数を追加して改善することができます


3
このアルゴリズムは、非常に高品質の(「暗号」のような)乱数のセットを生成します(シードを破壊しないため、0を使用しても)-多くの異なる言語(ソースを含む)に移植されており、高速です: burtleburtle.net/bob/rand/isaacafa.html
Randolf Richardson

6

これを試して。番号1からnまで反復します。nは描画する樹木の数です。各数値のハッシュを計算します。バックグラウンドで要素を描画または配置する関数の入力としてハッシュを使用します。たとえば、128ビットMD5ハッシュの最初の8ビットをxパーセンテージとして使用し、次をyパーセンテージとして使用し、次をある種のxスケーリングとして使用できます。同じハッシュ関数を使用して、同じ入力。実行するたびに同じ出力が得られます。

これは絶対に良いランダム性を与えるはずであり、確定的です。

また、これが適切な回答でない場合は、理由を説明するコメントを残してください。

ウィキペディアを見ると、この方法は有望に見えます。

http://en.wikipedia.org/wiki/Random_number_generation#Computational_methods


私はそれをまだ理解しようとしているだけではありません:)

ありがとう。コメントを投稿できるように、50ポイントを獲得するのがどれほど難しいかが少しイライラしました...

これは、PRNGで正常に機能するもののオーバーヘッドがかなり高くなります(各要素の安全なハッシュ関数を計算する)。(私はあなたに反対票を投じているわけではなく、なぜそれが最良の解決策ではないと思うのかを説明しているだけです。)

同意した。おそらく、高速だが悪いハッシュアルゴリズムを使用し、それをビットストリームとして実装して、無駄を省くことがより効率的にできるでしょうか?

5

あらゆる種類のハッシュ(MD5など)またはチェックサム(CRC32など)にアクセスできる場合は、一連の数値をハッシュできます。

それ以外の場合、おそらく最も単純なPRNGは線形合同生成器です。それは複雑な響きの名前を持っていますが、それを書くことは非常に簡単です:

3つの定数ma、およびcを選択します
まず、x prevをシードに設定します。
次に、新しい値x nextを生成するたびに、

x next =(a * x prev + c)mod m  
x prev = x next

ma、およびcのいくつかの適切な選択肢は、ここで見つけることができます


3

生成されたシードされた乱数は、基本的にオフセット(開始インデックス)であるシードを使用した単なるルックアップテーブルなので、数値のCSV(カンマ区切り値)ファイルを読み取ることで単純な乱数を設定できます。

すべてのインスタンスが同じシードを使用している限り、疑似ランダム性を維持しながら確定的になります。



2

1つの可能性は、Ken Perlin(Perlin Noiseで知られている)によって発明されたシンプレックスノイズと呼ばれるアルゴリズムを使用することです。シンプレックスノイズ(Perlinノイズなど)の優れた機能の1つは、タイル化できることです。つまり、計算する必要のある可能性のある領域の小さな領域のみであり、これを目に見える継ぎ目なしで領域全体に繰り返すことができます。

ノイズ関数を反復可能にする、つまり、特定の入力ポイントに対して常に同じ値を生成するには、勾配を真にランダムではなく、疑似ランダムにする必要があります。それらは、関数が真にランダムではないという事実を隠すのに十分なバリエーションを持っている必要がありますが、バリエーションが多すぎると、ノイズ関数の予測できない動作が発生します。

シンプレックスノイズは、Perlinノイズよりも速く生成でき、乱数ジェネレーターを必要としません。理論を知っているだけで実装することは恣意的ではありませんが、それに役立ついくつかのソースコードがあります(Wikipediaから参照)。

疑似ランダムノイズを生成する他のオプションは、フラクタルとウェーブレットです。

状況に応じて、これらの手法のいずれかを使用して1次元で一連のデータを生成し、しきい値を適用して、その位置にツリーを配置するかどうかを決定します。


1

最も簡単な答え:プログラムに、事前に生成された数値を含むファイルをロードさせ、ランダムな(またはいずれにせよアルゴリズムによる)数値を生成してそのファイルに保存する簡単なユーティリティを記述します。

このようにして、大部分が良好なファイルを生成し、ランダムなシードに問題が発生するという問題に陥ることなく、残りの部分を手作業で微調整できます。


これを、数値を生成するための回答として与えられたアプローチと組み合わせると、使用している既成のエンジンに実装するのが最も簡単になると思います。
11

0

別のアプローチ:

ブロック暗号を使用し、固定キーを使用して、1からNまでの一連の数値を「暗号化」します。TEAは実装が簡単で、かなり高速です。

このアプローチの利点の1つは、一連の「ランダム」な数値が気に入らない場合に、別の暗号化キーを試し、まったく異なる一連の数値を取得できることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.