gauss、rand、sphrand 関数で乱数の生成に使用されるシード(Seed)値を設定します。シード値を設定してから gauss 関数や rand 関数、sphrand 関数を反復的に実行すると、同じ乱数列が生成されます。
詳細については、下記の例とランダム度を生成するを参照してください。
int seed(int number)
number には、シード値として使用される任意の数値を指定します。
Ball という NURBS 球を作成し、次のエクスプレッションを入力します。
Ball.translateX = rand(5);
アニメーションを巻き戻すと、Ball の移動 X (Translate X)アトリビュートは 0 ~ 5 の範囲に含まれる乱数(1.392 など)を受け取ります。アニメーションを再生すると、移動 X アトリビュートはフレームそれぞれについて、0 ~ 5 の範囲に含まれる異なる乱数を受け取ります。
アニメーションを再び巻き戻すと、最初の巻き戻し時とは異なる乱数(3.223 など)が Ball の移動 X アトリビュートに代入されます。
アニメーションを再び再生すると、最初の再生時とは異なる乱数が各フレームごとに Ball の移動 X アトリビュートに代入されます。すなわち、rand (5)を実行するたびに、異なる乱数列が生成されます。
このエクスプレッションを次のように変更します。
if (frame == 1) seed(1); Ball.translateX = rand(5);
アニメーションをフレーム 1 に巻き戻すと、seed (1)関数が実行され、0 ~ 5 の範囲の乱数(4.501 など)が Ball の移動 X アトリビュートに代入されます。
アニメーションを再生すると、rand (5)関数がフレームごとに実行され、たとえば次のような異なる値が返されます。
フレーム | 値 |
---|---|
1 | 4.501 |
2 | 3.863 |
3 | 3.202 |
4 | 3.735 |
5 | 2.726 |
6 | 0.101 |
アニメーションを巻き戻して再生するたびに、同じ乱数列が Ball の移動 X アトリビュートに代入されます。
シード値を変更すると、生成される乱数列が変わります。シード値に基づいて、乱数列の値を予測することはできません。
このエクスプレッションを次のように変更します。
if (frame == 1) seed(500); Ball.translateX = rand(5);
アニメーションを巻き戻して再生すると、rand (5)関数は次のような値を返します。
フレーム | 値 |
---|---|
1 | 4.725 |
2 | 2.628 |
3 | 0.189 |
4 | 0.004 |
5 | 4.834 |
6 | 0.775 |
seed 関数の引数を変更すると、生成される乱数列が変わります。
seed 関数を使用する場合、次のような誤りがよく見かけられます。
seed(1); Ball.translateX = rand(5);
アニメーションを巻き戻すと、Ball の移動 X アトリビュートは 4.501 という値を受け取ります。アニメーションを再生するときには、エクスプレッションが実行されるたびに移動 X アトリビュートに 4.501 が代入されます。
rand (5)を実行する前に必ず seed (1)が実行されるため、乱数列は常に初期化されることになります。したがって、rand (5)関数を実行するたびに、乱数列の最初の値(4.501)が返されます。
エクスプレッションまたは MEL スクリプト内で乱数のシード(Seed)値を設定すると、別のエクスプレッションまたは MEL スクリプト内の乱数関数(rand、sphrand、gauss)がそのシード値によって影響を受けます。さらに、現在の作業セッションで開かれるすべてのシーン内の乱数関数も設定済みの Seed 値によって影響を受けます。