Processingでアニメーションを作っています。いくつかのランダムなポイントがランダムに移動し、ソリッドを形成しています。アニメーションが遅すぎたので、フレームを保存してからムービーに追加することを考えていました。
同じプログラムを2回以上実行する必要があるため、Processingのrandom()関数の代わりにRandomクラスを使用していますが、seedパラメータの意味がわかりません。
何をシードにすればいいですか?このランダムな方法は均等に分散されていますか?
Processingでアニメーションを作っています。いくつかのランダムなポイントがランダムに移動し、ソリッドを形成しています。アニメーションが遅すぎたので、フレームを保存してからムービーに追加することを考えていました。
同じプログラムを2回以上実行する必要があるため、Processingのrandom()関数の代わりにRandomクラスを使用していますが、seedパラメータの意味がわかりません。
何をシードにすればいいですか?このランダムな方法は均等に分散されていますか?
シードとして何を入れるかは問題ではありません。毎回異なるシードを選択するため、実際にはパラメーターなしのままにしておく方がよいでしょう。シードを明示的に指定すると、ランダムな動作が得られます...しかし、実行するたびに同じランダムな動作になります!
これは、乱数ジェネレーターが実際には論理的にランダムではないためです。それらはアルゴリズムで生成されるため、疑似乱数です。シードはそのアルゴリズムの一部です。基本的に、アルゴリズムは範囲内で数値の均等な分布を生成します (実際、そのため、PRNG も十分にランダムでないと批判されることがよくあります)。
PRNG は、シード状態を使用して任意の開始状態から開始できます。その後、その状態で初期化されると、常に同じシーケンスが生成されます。
試す
new Random(System.currentTimeMillis());
ほぼ毎回異なるシードが得られます。それが十分かどうかはわかりませんが、一定のシードよりも確実に優れています。
ただし、 new Random() を実行すると
public Random() { this(++seedUniquifier + System.nanoTime()); }
これが起こることなので、少し試してみることをお勧めします。
Random クラスの JavaDocを見ると、nextInt()、nextFloat() などの特定のメソッドを呼び出して均一またはガウス分布を取得する必要があることがわかります。結果を再現可能にしたい場合は、シードに定数値を使用する必要があります。それ以外の場合は、実行するたびに結果を変えたい場合は、時間をシードするのが良い方法であることに同意します.