コマンド(MEL) |
MEL のみで使用可能 |
rand |
カテゴリ: 言語、数学 |
移動先: 概要 戻り値 関連項目 MEL の例
rand
[string|int] float|vector [float|vector]
rand は「元に戻す」が不可能、「照会」が不可能、「編集」が不可能です。
0->の範囲、または第 2 バージョンの場合は start_range から end_range までで均一に分散する乱数を返します。ベクトル バージョンでは、3 つそれぞれの成分の独立乱数を生成します。
複数の乱数ストリーム:
rand の 3 つのストリームベースの変形では、乱数の生成時に使用する乱数ストリームの名前をパラメータで指定できます。乱数ストリームの詳細については、後述の「MEL の複数の乱数ストリーム サポートの概要」の章を参照してください。
この関数の動作は、非ストリーム バージョンと同じです。ただし、乱数の生成は、デフォルトの乱数ストリームではなく、指定したストリームから行われます。最初の 2 つのストリームベースの変形では、ストリーム名は文字列で指定します。3 番目の変形では、ストリーム名として整数を指定します(これは内部で整数を文字列に変換する便利な関数で、数値だけのストリーム名が必要な場合に使用します)。
MEL の複数の乱数ストリーム サポートの概要
rand、sphrand 、と gauss によって返される乱数はすべて、乱数ストリームと呼ばれる固定シーケンスに従います。複数の乱数ストリームを Maya に追加する前に反復性を確認するには、seed 関数を使用してジェネレータに明示的に乱数種を指定して乱数を再現する方法しかありませんでした。
ただし、ランダム呼び出しが任意の順序で発生して乱数の再現が不可能または実用的でない場合があります。
この課題を解決するために、MEL は任意の数のユーザ定義乱数ストリームをサポートします。MEL の各ランダム呼び出し(rand、sphrand、gauss など)では、乱数生成時に使用される乱数ストリームを識別するストリーム名を与えることができます。ストリームは次のように暗黙的に作成されます。MEL の各ランダム関数は、まず指定したストリームが存在するかどうかをチェックし、存在しなければ作成し、内部デフォルトを使用して乱数種を与えます。
内部デフォルトは同じなので、同じランダム呼び出しセットを使用すると、デフォルトとユーザ定義ストリームは必ず同じシーケンス番号を生成します (この反復性は、seed 関数を使用して手動でストリームに乱数種を与えることで回避できます)。
ストリーム名には、キャラクタに「*」を含まない任意のユーザ定義文字列を使用できます。「default」という名前のストリームが事前に定義されており、これは非ストリームベースの MEL ランダム呼び出しで使用される、標準ストリームを参照します。
乱数ストリームの目的は、ユーザが特定の MEL ランダム呼び出し領域をターゲットにして、専用の乱数ストリームを使用できるようにし、結果として生成される乱数の反復性を保証することです
内部的には、ストリームは効率的なデータベースを通して管理されるので、大規模なストリーム カウント(100,000 など)を割り当てるのは合理的ではありません。delrandstr 関数を使用してストリームを削除することも可能です。乱数ストリームの状態は randstate 関数を使用して照会できます。
delrandstr, gauss, seed, sphrand
rand 42;
// Result: 39.1327 //
rand 42;
// Result: 23.8585 //
rand -80 42;
// Result: -12.1565 //
rand <<1,1,1>>;
// Result: <<0.531557, 0.920261, 0.515431>> //
rand <<1,1,1>> <<100, 200, 300>>;
// Result: <<81.2325, 38.4956, 266.008>> //
// <b>Multiple random number stream examples:</b><br>
string $s1 = "stream1";
// Result: stream1 //
rand $s1 42;
// Result: 39.1327 //
rand $s1 42;
// Result: 23.8585 //
string $s2 = "stream2";
// Result: s2 //
rand $s2 42;
// Result: 39.1327 //
rand $s2 42;
// Result: 23.8585 //
// Example using the convenience method which allows an integer to be used
// as the stream name:
// Assume `particleID' is an integer... //
rand particleID -80 42;
// Result: 33.6711 //