seed

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 値によって影響を受けます。