下午师妹问我,如果在R中一次生成多个随机数,和在一个循环中生成的随机数,会有什么不同?
简单地做个实验:
set.seed(123) runif(3) set.seed(123) for(i in 1:3) { print(runif(1)) }
两个输出的结果是一样的。无论是一次生成多个随机数,还是在一个循环中生成随机数,都是从一个种子出发,生成一个随机序列。如果初始的种子一样,那么生成的随机序列也是一样的。
从这里出发,开始探索一下R中随机数生成的原理。于是去看R中的源代码,在R 中直接输入runif得到的结果是:
> runif function (n, min = 0, max = 1) .External(C_runif, n, min, max) <bytecode: 0x9bd23a4> <environment: namespace:stats>
.External调用C_runif,而C_runif其实是一个指向动态链接库的指针,并不是一个函数的名字(看C_runif没有带有引号可知,关于这一点可以参考stackoverflow上的一个讨论 )。在R的源代码下,可以在src/main/name.c中,找到对应runif的函数:do_random2,还可以看到do_random2对应了多种分布,通过一个偏移量(offset)来区分,接受三个参数。
于是,我们找到了runif的底层源码,至于这个源代码能告诉我们什么,有空再写。