2012-10-03 14 views
6

"円滑な"乱数を生成するヒントを教えてください。 ここで私は滑らかであることを意味します:"滑らかな"乱数のアルゴリズム

乱数はゲームで使用されるものとします。風の方向と強さのために(誰もgoood古い "ワーム"を覚えていますか?)。もちろん、これらの値の乱数を1秒ごとに設定すると、非常に不安定になります。 私はむしろ、一定の値域で何らかの滑らかな振動を起こしています。一種のサイン波のようですが、はるかにランダムです。

誰も私が何を得ていますか? ;-) この種の動作を達成する方法についてのアイデアは高く評価されます。

+1

風をシミュレートしたい場合は、風向きを変更するタイミングを教えてくれる乱数の後にはおそらくあります。このランダムな時間イベントが発生したときに風向きを変更するが、ある角度と速度(やはりランダム)に方向を限定するので、ある範囲内の乱数を選択して徐々に+ 1(0.0〜5.0) 1秒ごとに(ランダムに0-3秒ランダムに)等ランダムな変化に0-180度になるまで一定の時間が再び無作為です。非常にシンプルですが、これらの時間や度合いの変更などをどのように実装するかはあなた次第です。 – pengibot

+1

@Jodrell Benfordの法則はここでは完全に適用できません。分布後の問題は興味深い質問かもしれませんが、ベンフォードの法則は単に数値的現象を記述しています。連続乱数分布を記述するものではありません(サンプリングされる離散分布を記述しますが、 )。 –

+0

風をベクトルとして表現し、ランダムな値で移動平均を行うことができます。それはあなたが平均したサンプルサイズに比例して変動を滑らかにします。 –

答えて

4

デルタ(変更)を小さくしたい場合は、デルタの小さな乱数を生成するだけです。

たとえば、代わりに:

windspeed = random (100)    # 0 thru 99 inclusive 

のような使用何か:

windspeed = windspeed - 4 + random (9) # -4 + 0..8 gives -4..4 
if windspeed > 99: 
    windspeed = 99 
if windspeed < 0: 
    windspeed = 0 

そうすれば、あなたの風速は依然として必要範囲内に維持され、それは今まで徐々に変化します。

徐々に変化しているものが一定方向からの角度であれば、これは速度のような絶対値と方向についても機能します。

これはかなりの測定に使用できます。

また

、あなたはおそらく、大きなデルタとその風速の変化を確実にするために、しかし、あなたが現在そうであるように、ゆっくりと、あなたのターゲット風速を生成することができますが、それに向かって徐々に移動したい場合:

windspeed = 50 
target = windspeed 
while true: 
    # Only set new target if previous target reached. 

    if target == windspeed: 
     target = random (100) 

    # Move gradually toward target. 

    if target > windspeed: 
     windspeed = windspeed + max (random (4) + 1, target - windspeed) 
    else: 
     windspeed = windspeed - max (random (4) + 1, target - windspeed) 

    sleep (1) 
+2

しかし、風速が上限または下限に突入する可能性はありませんか? – Boris

+2

@Boris、はい、あなたのポイントは何ですか?ランダムな天気の場合もそうです:-)特定の値(50のような値)に向かって重力を加えたいのであれば、それを達成するために乱数を重み付けするだけです。 – paxdiablo

+0

または、増分から希望の値を切り離す私の更新を見てください。 – paxdiablo

0

Perlin(またはより良いシンプレックス)ノイズは、平滑化されたノイズを生成する際に気になる最初の方法です。現在の値を加算または減算する1から-1までの数値を返します。あなたはそれをもっと微妙ではないと思わせるように複数にすることができます。最低の風の値-1と最高の風の値1を設定します。

次に、等)をペリン/シンプレックス入力として使用すると、値が「滑らか」に保たれます。