58

ステートメントを参照して、set.seed()明示的に設定しなかった場合、コードを実行した後に代わりにシードを取得できますか?

入力データのサンプルをランダム化する関数を含むコードを(対話的に/コンソールで)再実行しています(関数はkohonenパッケージの一部です)。さまざまな出力を確認するためにしばらくそれを試した後 (これは「不安定な」問題でした)、非常に興味深い結果が 1 つあることに気付きました。もちろん使用set.seed()したことはありませんが、コードを実行して結果を再現した後、シードを取得できるかどうか疑問に思いましたか?

?set.seedなるほど_

.Random.seed は、一様乱数ジェネレーターのシード セットを保存します。

しかし、それがどのように役立つかわかりません。

4

5 に答える 5

51

シードを保持していなかった場合、ランダム ドローを観察した後に、乱数ジェネレーターを以前の状態に "ロールバック" する一般的な方法はありません。今後.Random.seedは、計算結果とともに の値を保存することをお勧めします。このようなもの。

x <- .Random.seed
result <- <your code goes here>
attr(result, "seed") <- x

その後、次のように PRNG をリセットできます。result2と同じである必要がありますresult

.Random.seed <- attr(result, "seed")
result2 <- <your code goes here>
于 2013-10-27T03:48:27.893 に答える
0

getSeedこれは、関数の逆関数がないという問題を修正する試みsetSeedです。約 12 時間前に、Using R, how to get.seed()? に同様の質問を投稿しました。「重複」に分類されたため閉鎖されました...

グローバル変数を必要とするシードメモリを使用してソリューションを「ハッキング」しました.random.seed.memory

utils::globalVariables(c(".random.seed.memory"));

を使用して「シードを生成」する必要があるため、タイミングは重要ですset.seed

github.monte = "https://raw.githubusercontent.com/MonteShaffer/";
include.me = paste0(github.monte, "humanVerse/main/humanVerse/R/functions-str.R");  
source(include.me); # trimMe function

include.me = paste0(github.monte, "humanVerse/main/humanVerse/R/functions-random.R");  
source(include.me); # getSeed, setSeed, and so on.

この関数setSeedは一般に次のように動作しますが、整数 (kind、normal.kind、sample.kind)set.seedを超えて渡されるカスタム パラメーターはすべてset.seedリストする必要がありますargs.set。省略記号は、パラメーターを有効にして機能する内部関数に渡す...ために使用されるためです。setSeedinitSeed(...)setSeedgetSeed

rand()また、min、max、n、メソッドなどを渡すC 標準関数も作成しました。これは、「整数」を生成setSeedしてメモリに格納する方法です。デフォルトのシード生成 (および)Sys.time()の最小/最大として使用します。 単一の値を計算するために範囲内のベクトルを作成する必要があるため、悪い考えですが、これはwhich feedsのメソッド オプションです。デフォルトの「high-low」は、「floor」よりもわずかに高速であることがわかりました。min = -1*as.integer(Sys.time())max = as.integer(Sys.time())samplerand()initSeed

利用方法

### VERBOSITY is HIGH AT THE MOMENT ###

print("random 5"); rnorm(5);

setSeed(NULL);  # this will automatically call initSeedMemory() if necessary
setSeed(.random.seed.memory$last); rnorm(5);
setSeed(getSeed()); rnorm(5);

print("random 5"); rnorm(5);

setSeed(getSeed()); rnorm(5);

デフォルトでは、「last」と呼ばれるグローバル リストの要素にシード値を格納します。これにより、実行中のプロセスに応じて異なるメモリ シードを追跡できます。以下の例では、具体的には「last」にアクセスし、「nsim」...メモリに格納されている 2 番目のシードにアクセスします...

### VERBOSITY is HIGH AT THE MOMENT ###

initSeedMemory( purge.memory = TRUE);
setSeed(NULL); 
setSeed(.random.seed.memory$last); rnorm(5);
setSeed(getSeed()); rnorm(5);
getSeed(); # accessor to .random.seed.memory
.random.seed.memory;

print("random 5"); rnorm(5);

setSeed(NULL, key="nsim"); rnorm(5);
setSeed(.random.seed.memory$nsim, key="nsim"); rnorm(5);
setSeed(getSeed("nsim"), key="nsim"); rnorm(5);
getSeed("nsim"); # accessor to .random.seed.memory
.random.seed.memory;

print("random 5"); rnorm(5);

setSeed(.random.seed.memory$last); rnorm(5);
setSeed(getSeed()); rnorm(5);
.random.seed.memory;

set.seed(.random.seed.memory$last); rnorm(5);
set.seed(.random.seed.memory$nsim); rnorm(5);

.random.seed.memory;

print("random 5"); rnorm(5);

もちろん、バグがあるかもしれません。提案やバグを見つけていただければ幸いです。

-- 2021 年 2 月 19 日午前 5 時頃 (PST) --

もちろん、固定シードを渡す機能も可能です。

setSeed(NULL, "nsim"); rnorm(5);  # randomly generated seed under the hood, but stored
setSeed(123, "z5"); rnorm(5);     # you can still fix the seed manually yourself, still stored and accessible in the list
setSeed(getSeed("nsim"), "nsim"); rnorm(5);
setSeed(getSeed("z5"), "z5"); rnorm(5);
于 2021-02-19T12:46:01.920 に答える