21

set.seed()が機能し、いつ使用するかは理解していますが、機能についてはまだ多くの質問があります。ここにいくつかあります:

  1. セッションの早い段階でset.seed()呼び出した場合、「よりランダムな」ものに「リセット」することは可能ですか? set.seed()それも必要ですか?
  2. R が現在使用しているシードを表示することはできますか?
  3. random.orgset.seed()で英数字のシードを入力できるようにする方法はありますか (詳細モードになっていることを確認し、フォームの「パート 3」を参照して、私の意味を確認してください)。
4

5 に答える 5

18

楽しみのために:

set.seed.alpha <- function(x) {
  require("digest")
  hexval <- paste0("0x",digest(x,"crc32"))
  intval <- type.convert(hexval) %% .Machine$integer.max
  set.seed(intval)
}

したがって、次のことができます。

set.seed.alpha("hello world")

(実際xには、英数字の文字列だけでなく、任意の R オブジェクトにすることができます)

于 2012-06-06T11:29:57.237 に答える
15

シードを時間エポックの最後の桁のようなものに設定すれば可能ですが、実際には必要ありません。PRNG の使用目的は、セッションの開始時にシードを 1 回設定し、これから生成された連続する変量を使用することです。やり方を変えると、R RNG が持つさまざまな優れた理論的および経験的特性を楽しむことができなくなります。

しかし、set.seed の目的を本当に理解しているかどうかはわかりません。「よりランダムな」数値を取得することは実際にはありません。R PRNG が不十分なある種のアプリケーションを実行している場合 (たとえば、暗号のランダム性が必要な場合)、別の方法ですべての乱数を生成し、それらを直接使用することもできます。set.seed の本当の目的は、RNG を使用して結果の再現性を生み出すことです。同じシーケンスの乱数生成を使用して同じ分析を開始し、シードを同じ値に設定すると、常に同じ結果が得られます。これは、デバッグや、他の人が結果をレビューする際に役立ちます。

エポック時間を使用するには、次のようにします

t <- as.numeric(Sys.time())
seed <- 1e8 * (t - floor(t))
set.seed(seed); print(seed)
于 2012-06-06T08:47:19.710 に答える
3

2 の回答については、まずヘルプ ページを参照してください?RNGkind

使用中の RNG の種類を確認するには:

RNGkind()
# [1] "Mersenne-Twister" "Inversion" 

Mersenne Twister がデフォルトです。

ヘルプページから:

'"Mersenne-Twister":' 松本・西村 (1998) より。周期 2^19937 - 1 のねじれた GFSR と 623 の連続した次元 (全周期にわたって) の等分布。「シード」は、32 ビット整数の 624 次元のセットと、そのセット内の現在の位置です。

現在使用されているシードを見つけるには、まず乱数ジェネレーターを呼び出す必要があります。

runif(1, 0, 1)                                                                                                                                                  
# [1] 0.9834062                                                                                                                                                      
.Random.seed
# [Gives a 626 length vector]

set.seed(some_integer)を続けて呼び出す.Random.seedと、同じ を使用すると、常に同じ長さの 626 ベクトルが得られますsome_integer。別の言い方をすれば、626 の長さのベクトルはsome_integer、もちろんメルセンヌ ツイスターを使用しているとすれば、 によってのみ決定されます。

また、もちろん、set.seedある固定値まで実行すると、それに続く乱数ルーチンの呼び出しでも同じ値が得られます。これは、再現性を与えるために、実際に主に使用されます。例えば

set.seed(1)
runif(5, 0, 1)
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
rnorm(1, 0, 1)
# [1] 1.272429
set.seed(1)
runif(5, 0, 1)
# [1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
rnorm(1, 0, 1)
# [1] 1.272429

R の基本的なナンバ ジェネレータ コードはすべて、ソース コードのファイルsrc/main/RNG.cにあります。

これは C 言語ですが、従うのはかなり簡単です。

于 2013-05-31T21:05:50.640 に答える