runifが毎回同じ結果を生成しないのはなぜですか?


11

runif()Rのような乱数ジェネレーターが毎回同じ結果を生成しないのはなぜですか?

例えば:

X <- runif(100)
X

毎回異なる出力を生成しています。

毎回異なる出力を生成する理由は何ですか?

これを行うために、バックグラウンドでどのような機能が実行されていますか?


3
これについて考える1つの方法は、「乱数ジェネレーターが毎回同じ数を生成するようにしたいですか?」と自問することです。
シャドウトーカー2014年

2
@ssdecontrol:ディルバートを
ヘンリー

2
またはxkcd
Henry

回答:


18

実は、これはRの質問だけではありません。より一般的には、乱数の生成に関連しています。

「ランダムな」数値は、統計の多くの部分で非常に重要です。特定のプロパティを持つために生成するランダム値が必要であり、(通常)乱数ジェネレーターの構築とそのプロパティのチェックに多くの労力が費やされます。

アイデアは、実際に乱数の良い代用となる一連の値を取得したいというものです。乱数生成の通常の主力は、均一分布です(そこからガウス乱数のような他のものを構築します)。

[0,1)

たとえば、多くの人は前のものに取り組んでいます:

x1=f(x0)z1=x1/mx2=f(x1)z2=x2/mx3=f(x2)z3=x3/m

xzf

x0

x3

?runifRを参照してください。?.Random.seedこれにより、Rで使用可能な多数の乱数ジェネレータを説明するヘルプへのリンクとともに、ランダムシードの存在について説明されていることがわかります(独自の乱数ジェネレータを提供することもできます)。同じヘルプページでは、以前に乱数生成を使用したことがない場合、またはシードを設定していない場合は、シードから始めて、クロックから取得され、その後、以前の値が格納されることがわかります(そのため、次に取得する乱数は前回値をもう1つ生成した場合に取得したものと同じもの-「どこにいるのか」を記憶しています)。

runifR の関数(他のパッケージに含まれるかなりの数の乱数生成ルーチンのように、通常は同様の処理を行うことができます)は、乱数シードが保持される場所を認識しています。それはその値を更新し続けます。したがって、明示的にシードを渡さなくても機能しますが、シードを使用します。与えなかった場合は、最後に保存したものを使用します。

それが毎回異なる出力を与える理由については(同じシーケンスを与えるように指示しない場合):毎回同じ値は通常、非常に非生産的であるため、これを行います-繰り返されるプロパティがありませんランダムサンプリングの場合、乱数ジェネレーターを使用するputposeにはあまり役立ちません。


14

毎回同じ結果を得るには、ランダムシードを設定する必要があります。そのためには?set.seedを使用します。検討してください:

> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087

これを読むことに興味があるかもしれません: set.seed関数を使用する理由


3
これは一連の結果を再現するメカニズムを説明しますが、質問自体には対応していないようで、なぜこの種の動作が自動的ではないのか疑問に思います。
whuber

@whuber、私は質問がここで離れて話題になっていないと思います。私は即座に閉鎖することに投票し、その特権があれば完全に閉鎖したでしょう。OPが手ぶらにならないように、私はこれを投稿しました。
gung-モニカの回復

毎回「set.seed(1)」を実行します。
ニップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.