Help us understand the problem. What is going on with this article?

set.seedでの乱数固定を解除する

More than 1 year has passed since last update.

例えば、関数Aはユーザーが乱数を固定して何かしたいものだとして、関数Bは乱数を固定せず何かしたいものだとする。

A <- function(seeds=123){
    set.seed(seeds)
}

B <- function(){
    print(runif(1))
    print(runif(1))
    print(runif(1))
}

もし関数Bを実行する前に、関数Aを実行してしまった場合、例えそれが関数の中で評価されたものだとしても、乱数が固定された状態が続いてしまうらしい。

A()
B()
# > A()
# > B()
# [1] 0.2875775
# [1] 0.7883051
# [1] 0.4089769

A()
B()
# > A()
# > B()
# [1] 0.2875775
# [1] 0.7883051
# [1] 0.4089769

関数Aがテストデータ生成、関数Bが乱数を元にしたアルゴリズムだったりした場合、乱数が固定されて毎回同じ結果を返しているだけなのに、やけに収束が良いアルゴリズムだと勘違いしてしまいそうだ。

なので、set.seed(数字)のあとは、以下のように必ずどこかでset.seed(NULL)を入れないと、予期せぬことが起こりそう。

A <- function(seeds=123){
    set.seed(seeds)
    set.seed(NULL)
}

B <- function(){
    print(runif(1))
    print(runif(1))
    print(runif(1))
}

A()
B()
# > A()
# > B()
# [1] 0.7819413
# [1] 0.4793704
# [1] 0.8743641

A()
B()
# > A()
# > B()
# [1] 0.7548444
# [1] 0.07935513
# [1] 0.7085605
A()
B()
# > A()
# > B()
# [1] 0.2875775
# [1] 0.7883051
# [1] 0.4089769

A()
set.seed(NULL)
B()
# > A()
# > set.seed(NULL)
# > B()
# [1] 0.5758005
# [1] 0.4120173
# [1] 0.2110562
antiplastics
書くぜーどんどん書くぜー(書いてない
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away