关于set.seed()

    最近在上Stanford的公开课Statistic Learning,用到的语言是R。之前有接触过R,很多人也推荐用它来做数据分析,因为很方便,包也很多,做可视化也非常赞。

看书的时候看到了set.seed()这么个function,大概知道是怎么个回事,但是不太清楚相关算法的细节,而且以前用random的时候也没有想那么多(计算机是如何产生随机数的,它的算法是怎么样的,只是觉得理所当然,随手拿来用),于是上网查了下。


书中的原文:

Sometimes we want our code to reproduce the exact same set of random numbers; we can use theset.seed()function to do this. Theset.seed()function takes an (arbitrary) integer argument. 


> set.seed(1)

> rnorm (4)

> set.seed(1)

> rnorm (4)



首先讲一下为什么要用到seed(设置种子):


    因为计算机其实并不能产生真正的随机数,准确的讲它所产生的是伪随机数。计算机只是模拟随机过程,用算法来模拟进而得到结果。当然如果想要拿到真正的随机数,可以外接物理随机数发生器,然后将其产生的信号转换为随机值。

如果你不设种子,计算机会用系统时钟来作为种子,如果你要模拟什么的话,每次的随机数都是不一样的,这样就不方便你研究,如果你事先设置了种子,这样每次的随机数都是一样的,便于重现你的研究,也便于其他人检验你的分析结果。


随机数产生原理,通常有两种方法  :

1.平方取中法 
1)从一个n位数x开始,称为种子 
2)将它平方得到一个2n位数(必要时前面加0) 
3)取中间的n位数做为下一个随机数 
这种方法有一个缺点就是产生的随机数会趋向0 

2.线性同余法 http://en.wikipedia.org/wiki/Linear_congruential_generator

选择三个整数a,b,c,给定初始种子X(0) 

按下列规则生成数列 
X(n+1)=( a * X(n) + b )mod(c) 
线性同余法的一个例子:
取a=1, b=3, c=5
那么 X[n+1] = (X[n] + 3) mod 5
生成的数列为:
种子        数列
0              3, 1, 4, 2, 0, 3, 1, 4, 2, 0, ....

1             4, 2, 0, 3, 1, 4, 2, 0, 3, 1, ....

2             0, 3, 1, 4, 2, ...


    因此我们可以看到这种方式产生的随机数会出现循环,但是只要我们把c取得足够大就可以保证不会在我们运算中出现循环。很多计算机都是利用这个原理产生随机数的。只要把c值取得很大,一般就不会出现循环。

对于每个种子,所得到的数列看起来都是随机的(每个数值出现的频率都是相同的)。而一旦种子给定,每次调用随机数函数,函数都会根据上次得到的数列的某个值,计算出数列的下一个值并返回回来。因此只要设定了相同的种子,就能得到一样的随机数列。这么做的好处在于,比如你在做研究的时候代码中有用到随机数据,当别人也想实现你的算法来验证和比较结果的时候,相同的可重复使用的数据就很重要了。

再举个例子,学生可以取他们的名字作为seed(char2seed,TeachingDemos Package),这样每个学生都有他们自己唯一的数据库。而这时老师也可以产生相同的数据库,进而对学生进行grading。




### R语言 `set.seed` 函数使用方法 #### 设置伪随机数生成器的种子 为了确保每次运行程序时生成的随机数序列相同,从而让结果可重复再现,在R语言中可以通过调用`set.seed()`来实现这一目标[^3]。 ```r # 设定种子为123以便后续操作能够得到一致的结果 set.seed(123) ``` 此命令会初始化R使用的伪随机数发生算法的状态。当指定相同的参数值给`set.seed()`,之后执行涉及随机性的运算将会遵循同样的模式[^2]。 #### 结合其他函数一起工作 通常情况下,`set.seed()`会在涉及到随机抽样的地方之前被调用,比如创建服从特定分布的数据集或是打乱数据顺序等场景下: ```r # 创建一个正态分布样本并绘制直方图 set.seed(123) x <- rnorm(100, mean = 100, sd = 10) hist(x, breaks = 20) ``` 上述代码片段展示了如何利用设定好的种子去获取一组均值为100标准差为10的一百个数值,并将其可视化出来;如果再次运行这段代码而保持seed不变,则所获得图形应当完全一样[^4]。 另外值得注意的是改变传入`set.seed()`的不同整型参数也会相应地影响到后面产生的随机系列特性: ```r # 更改种子后重新抽取另一组不同的正态分布样本 set.seed(234) y <- rnorm(100, mean = 100, sd = 10) hist(y, breaks = 20) ``` 这里改变了初始状态(即新的种子),因此即使采用相同的统计特征构建新数组,其具体成员还是会有所区别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值