このセクションのDATAステップで、乱数関数のプロパティをいくつか説明します。関数を呼び出すDATAステップは、各ステップとも初回呼び出しの初期シードが7となっているため、それぞれシード値7に基づく単一の疑似乱数ストリームを生成します。一部のDATAステップでは、各種の方法でシード値を変更します。関数呼び出しが1つしかないステップもあれば、複数の関数呼び出しが行われるステップもあります。これらのDATAステップは、どれもシードを変更しません。関数呼び出しに関連するシードは、最初の乱数関数の初回実行に使われるシードのみです。関数で独立したストリームを作成する方法はなく(作成するにはCALLルーチンを使用します)、新しいDATAステップを開始するしか、関数による乱数ストリームを再開する方法はありません。
次の例では複数のDATAステップを実行します。
/* This DATA step produces a single stream of random numbers */
/* based on a seed value of 7. */
data a;
a = ranuni (7); output;
a = ranuni (7); output;
a = ranuni (7); output;
a = ranuni (7); output;
a = ranuni (7); output;
a = ranuni (7); output;
a = ranuni (7); output;
a = ranuni (7); output;
a = ranuni (7); output;
a = ranuni (7); output;
a = ranuni (7); output;
a = ranuni (7); output;
run;
/* This DATA step uses a DO statement to produce a single */
/* stream of random numbers based on a seed value of 7. */
data b (drop = i);
do i = 7 to 18;
b = ranuni (i);
output;
end;
run;
/* This DATA step uses a DO statement to produce a single */
/* stream of random numbers based on a seed value of 7. */
data c (drop = i);
do i = 1 to 12;
c = ranuni (7);
output;
end;
run;
/* This DATA step calls the RANUNI and the RANNOR functions */
/* and produces a single stream of random numbers based on */
/* a seed value of 7. */
data d;
d = ranuni (7); f = ' '; output;
d = ranuni (8); f = ' '; output;
d = rannor (9); f = 'n'; output;
d = .; f = ' '; output;
d = ranuni (0); f = ' '; output;
d = ranuni (1); f = ' '; output;
d = rannor (2); f = 'n'; output;
d = .; f = ' '; output;
d = ranuni (3); f = ' '; output;
d = ranuni (4); f = ' '; output;
d = rannor (5); f = 'n'; output;
d = .; f = ' '; output;
run;
/* This DATA step calls the RANNOR function and produces a */
/* single stream of random numbers based on a seed value of 7. */
data e (drop = i);
do i = 1 to 6;
e = rannor (7); output;
e = .; output;
end;
run;
/* This DATA step merges the output data sets that were */
/* created from the previous five DATA steps. */
data five;
merge a b c d e;
run;
/* This procedure writes the output from the merged data sets. */
proc print label data=five;
options missing = ' ';
label f = '00'x;
title 'Single Random Number Streams';
run;
このプログラムの結果出力を次に示します。
出力データセットA、BおよびCの疑似乱数ストリームは同一です。出力データセットDのストリームには、RANUNI関数とRANNOR関数への呼び出しが併用されています。オブザベーション1、2、5、6、9、10では、RANUNIから返される値が先のストリームの値と完全に一致しています。"n"フラグ付きのオブザベーション3、7および11には、RANNOR関数から返された値が含まれています。関数呼び出しを併用しても、疑似乱数ストリームの生成には影響しません。結果はすべて、一様に分布した値の単一ストリームに基づいています。RANNORなどの他の関数によって変換されてから返されるものもあります。RANNOR関数の結果は、RANUNIへの2回の内部呼び出しによって生成されたものです。出力データセットDを作成するDATAステップは、次のステップを3回実行し、12のオブザベーションを作成します。
-
-
-
RANNORへの呼び出し(RANUNIへの内部呼び出しを2回実行)
-
RANUNIへの2回目の内部呼び出しを補正するためのスキップ行
データセットEを作成するDATAステップでは、RANNORが6回呼び出されます。呼び出し時に毎回1行をスキップしますが、これはRANNORへの呼び出しごとに実行される2回のRANUNIへの内部呼び出しを補正するためです。データセットDを作成するDATAステップでRANNORから返される3つの値は、データセットEの対応する値と一致しています。