web-dev-qa-db-ja.com

シード設定時の整数はどういう意味ですか?

[〜#〜] r [〜#〜]sample()関数を使用して、データセットからn行をランダムに選択したいと思います。毎回異なる出力を取得していたため、set.seed()関数を使用して同じ出力を取得しました。 set.seed()の各整数は一意の出力を提供し、同じシードを設定すると出力は同じになることを私は知っています。しかし、set.seed()関数にパラメーターとして渡される整数が何を意味するのか理解できません。ランダムジェネレータアルゴリズムに入るのは単なるインデックスですか、それともサンプリングを開始した場所からのデータの一部を意味しますか?たとえば、set.seed(2)2はどういう意味ですか?

16

ランダムシード(またはシード状態、または単にシード)は、疑似乱数ジェネレーターを初期化するために使用される数値(またはベクトル)です。

疑似乱数ジェネレータで使用されるシードの場合、ランダムである必要はありません。数値生成アルゴリズムの性質上、元のシードが無視される限り、アルゴリズムが生成する残りの値は、疑似ランダムな方法で確率分布に従います。

-- ウィキペディア

したがって、ランダム関数は次のように実装できます。

int Rand_r(unsigned int *seed)
{
    *seed = *seed * 1103515245 + 12345;
    return (*seed % ((unsigned int)Rand_MAX + 1));
}

(glibcから取得したサンプル)

10
kometonja

昔は ランダムな数字のページとページ (もちろんランダムな順序で)を含む本がありました。

set.seed(x)は、巨大な乱数の本のxページから乱数の読み取りを開始するようにコンピューターに指示するものと考えるのが好きです。 xはデータとは何の関係もありませんが、乱数を選択するためのアルゴリズムをどのように開始する必要があります。

これは少し簡単かもしれませんが、私はアナロジーが好きです。

24
Charlie

これは、乱数ジェネレーターのシードを設定するために使用される単なる数値です。それはあなたのデータとは何の関係もありません。シードを明示的に指定しない場合、現在の時刻から新しいシードが作成されます。

詳細については、?set.seedヘルプページを参照してください。

5
juba