乱数生成アルゴリズムを変更する
Text Update: 09/15, 2019 (JST)

R 3.6.0から乱数生成アルゴリズムが変更されています。このため書籍などのサンプルコードを実行した場合、乱数シードを固定しても実行結果が異なってしまします。

 

アルゴリズム変更の背景

R News に記載されているように乱数生成アルゴリズムのデフォルトが変更されています。

The default method for generating from a discrete uniform distribution (used in sample(), for instance) has been changed. … The previous method can be requested using RNGkind() or RNGversion() if necessary for reproduction of old results.

 
変更の理由は PR#17494 にあるように非常に大きな数値を指定した場合に乱数生成に不具合が出るためです。

 

前方互換性の確保

書籍などのサンプルコードと同様の結果を得たい場合にはRNGVersion関数で、サンプルコードの環境と同じバージョンを指定します。R Markdownを利用しているのであればセットアップ・チャンクに以下のコードを記述しておくと便利です。
 

if (getRversion() >= "3.6.0") {
  RNGversion("3.2.0")           # サンプルコードが前提としているRのバージョン
}

 
Rソースの場合は最初に実行してください。

 

動作例

set.seed(123)
sample(1000, 900) %>% head(10)
##  [1] 415 463 179 526 195 938 818 118 299 229
RNGversion("3.2.0")
set.seed(123)
sample(1000, 900) %>% head(10)
##  [1] 288 788 409 881 937  46 525 887 548 453

 

利用しているバージョンのデフォルトに戻す場合には以下のコードを実行します。

RNGversion(getRversion())
set.seed(123)
sample(1000, 900) %>% head(10)
##  [1] 415 463 179 526 195 938 818 118 299 229

 

注意

日本語Windows環境においてR Markdownのセットアップ・チャンク内でRNGVersion関数を記述するとセットアップ・チャンクを実行した際にNULLエラーが発生する場合があります。少なくとも私の環境では100%発生します。ただ、[Knit]ボタンでレンダリングする場合にはエラーが発生しません。
このような場合は、R3.5を利用するか、セットアップ・チャンク以外のチャンク内で実行してください。

 
Enjoy!  

本blogに対するアドバイス、ご指摘等は データ分析勉強会 または GitHub まで。

CC BY-NC-SA 4.0 , Sampo Suzuki