私は横スクロールゲームに取り組んでおり、背景の森を生成したいと考えています。品質が同じであることを確認するために、すべての人の背景を同じにしてください。シードされた乱数ジェネレーターにもアクセスできないため、適切なシードを見つけてそこから移動できません。
アイデア?
私は横スクロールゲームに取り組んでおり、背景の森を生成したいと考えています。品質が同じであることを確認するために、すべての人の背景を同じにしてください。シードされた乱数ジェネレーターにもアクセスできないため、適切なシードを見つけてそこから移動できません。
アイデア?
回答:
最も明白な方法は、おそらく独自の乱数ジェネレータを作成することでしょう。特に、ランダム性について特に高い基準を満たす必要がないため(明らかに見えるパターンがないだけ)、半ダース以下のコードでかなり合理的なパターンを書くのは非常に簡単です。
必要に応じてオブジェクト密度を同じにする引数を追加して改善することができます
これを試して。番号1からnまで反復します。nは描画する樹木の数です。各数値のハッシュを計算します。バックグラウンドで要素を描画または配置する関数の入力としてハッシュを使用します。たとえば、128ビットMD5ハッシュの最初の8ビットをxパーセンテージとして使用し、次をyパーセンテージとして使用し、次をある種のxスケーリングとして使用できます。同じハッシュ関数を使用して、同じ入力。実行するたびに同じ出力が得られます。
これは絶対に良いランダム性を与えるはずであり、確定的です。
また、これが適切な回答でない場合は、理由を説明するコメントを残してください。
ウィキペディアを見ると、この方法は有望に見えます。
http://en.wikipedia.org/wiki/Random_number_generation#Computational_methods
あらゆる種類のハッシュ(MD5など)またはチェックサム(CRC32など)にアクセスできる場合は、一連の数値をハッシュできます。
それ以外の場合、おそらく最も単純なPRNGは線形合同生成器です。それは複雑な響きの名前を持っていますが、それを書くことは非常に簡単です:
3つの定数m、a、およびcを選択します。
まず、x prevをシードに設定します。
次に、新しい値x nextを生成するたびに、
x next =(a * x prev + c)mod m x prev = x next
1つの可能性は、Ken Perlin(Perlin Noiseで知られている)によって発明されたシンプレックスノイズと呼ばれるアルゴリズムを使用することです。シンプレックスノイズ(Perlinノイズなど)の優れた機能の1つは、タイル化できることです。つまり、計算する必要のある可能性のある領域の小さな領域のみであり、これを目に見える継ぎ目なしで領域全体に繰り返すことができます。
ノイズ関数を反復可能にする、つまり、特定の入力ポイントに対して常に同じ値を生成するには、勾配を真にランダムではなく、疑似ランダムにする必要があります。それらは、関数が真にランダムではないという事実を隠すのに十分なバリエーションを持っている必要がありますが、バリエーションが多すぎると、ノイズ関数の予測できない動作が発生します。
シンプレックスノイズは、Perlinノイズよりも速く生成でき、乱数ジェネレーターを必要としません。理論を知っているだけで実装することは恣意的ではありませんが、それに役立ついくつかのソースコードがあります(Wikipediaから参照)。
疑似ランダムノイズを生成する他のオプションは、フラクタルとウェーブレットです。
状況に応じて、これらの手法のいずれかを使用して1次元で一連のデータを生成し、しきい値を適用して、その位置にツリーを配置するかどうかを決定します。
最も簡単な答え:プログラムに、事前に生成された数値を含むファイルをロードさせ、ランダムな(またはいずれにせよアルゴリズムによる)数値を生成してそのファイルに保存する簡単なユーティリティを記述します。
このようにして、大部分が良好なファイルを生成し、ランダムなシードに問題が発生するという問題に陥ることなく、残りの部分を手作業で微調整できます。