下面是在论坛上搜到的以前有人回复的:
计算机的程序,都是通过确定的算法,根据确定的输入,算出确定的输出。想要得到真正的随机,需要通过外接物理随机数发生器,通过把随机的物理过程转变为随机值,才能实现。因此我们平常使用的计算机的随机数,其实都只是通过算法模拟得到,也就是伪随机。一般采用的办法是线性同余(参见http://en.wikipedia.org/wiki/Linear_congruential_generator)。
X[n+1] = (a * X[n] + c) mod m
为简单起见,我取简单的参数(a = 1, c = 3, m = 5),得到一个简单的算式:
X[n+1] = (X[n] + 3) mod 5
这时,把X[0]视为种子,于是:
若种子为0,得到数列:0, 3, 1, 4, 2, 0, ...
若种子为1,得到数列:1, 4, 2, 0, 3, 1, ...
若种子为2,得到数列:2, 0, 3, 1, 4, 2, ...
若种子为3,得到数列:3, 1, 4, 2, 0, 3, ...
若种子为4,得到数列:4, 2, 0, 3, 1, 4, ...
对于每个种子,所得到的数列看起来都是随机的(每个数值出现的频率都是相同的)。而一旦种子给定,每次调用随机数函数,函数都会根据上次得到的数列的某个值,计算出数列的下一个值并返回回来。而对于随机浮点数,一般是用随机产生的整数除以最大整数得到。
所以,随机数的种子一般只需要在调用随机函数之前设置一次,不建议设置多次。
这个人最后一句说“随机数的种子一般只需要在调用随机函数之前设置一次,不建议设置多次。”,但是如果用到多个随机数生成函数的时候只设置一次随机种子不能保证结果具有“可重复性”吧???应该是在每次用到一个随机数生成函数的时候就应该设置一次随机种子以保证实验结果具有“可重复性”吧?下面是在英文网页上看到的一个帮助信息:
Any call that uses the random number generator will change the current seed, even if you've manually set it with set.seed:
<br />
set.seed(1)<br />
x <- .Random.seed # get the current seed<br />
runif(10) # uses random number generator, so changes current seed<br />
y <- .Random.seed identical(x, y) # FALSE<br />
So,you'd have to reset the seed before each use of the random number generator to guarantee that it uses the same one each time.
</p>