如何捕获在set.seed(42)之后执行两次rnorm(5)的随机数

m
microsat
楼主 (北美华人网)
set.seed(42) rnorm(5) [1] 1.3709584 -0.5646982 0.3631284 0.6328626 0.4042683 rnorm(5) [1] -0.10612452 1.51152200 -0.09465904 2.01842371 -0.06271410
设置了set.seed(42)后,当执行rnorm(5)两次,就能得到 上面最后一行的这些随机数。
问题是 1)这一行 随机数和第一次执行rnorm(5)产生的随机数有何关系呢? 2)如何完全一模一样的把第二次执行rnorm(5)的随机数 复制出来呢?
我试了set.seed(43), 然后rnorm(5),发现复制不出来。
我知道下面的代码可以复制,但是我寻求除了这之外的另一种方法。 set.seed(42) rnorm(5) rnorm(5)
有人能解释一下。为什么第二次rnorm(5)产生的随机数,只要一开始设置了set.seed(42), 就永远是相同的吗? 第一次rnorm(5)相同,我能理解,因为set.seed(42); 但是为何第二次rnorm(5)后的,都永远相同呢?

马佳168
你去读一下伪随机数的原理吧,然后就知道你这个问题如何回答了。 你能问出set seed(43)说明你基本概念不懂。
x
xiaohuihui
先设好种子,生成五个伪随机数后,种子就变了(每取一个随机数,种子就变化一次),第二次取五个伪随机数是根据第一次取完时候seed的值来定的.这就是两组数的关系。
你每次都这样运行, 种子变化的状态是一样的。 所以可以重复。

m
microsat
先设好种子,生成五个伪随机数后,种子就变了(每取一个随机数,种子就变化一次),第二次取五个伪随机数是根据第一次取完时候seed的值来定的.这就是两组数的关系。
你每次都这样运行, 种子变化的状态是一样的。 所以可以重复。


xiaohuihui 发表于 2022-06-22 18:51

多谢!
我还有一个并行和串行,如何产生相同的随机数的问题。
串行是这样的 set.seed(42) for ( i in 1:10) { x <- rnorm(1) print(x) }
假设并行的cores是5个。那么如何每个cores产生2个随机数。5个cores产生10个随机数 和上面这个串行产生的随机数一模一样。
上面是将串行产生的随机数,转换到并行里的。
我还有一个问题 是 如何将一个并行的产生的随机数,用串行,一模一样的复制出来。




马佳168
你set.seed(42) rnorm(10) 和你之前的rnorm (5)两次比较一下。
再自己思考一下
x
xiaohuihui
你试一下,应该和set.seed(42) rnorm(10) 是一样的。前提是你loop里不要产生其他随机数的语句。
生成伪随机数是一个链条,初始种子定好后,后面生成的数和当前产生出来的数有关系,你连续产生8个normal 再来一个runif(1),再来第十个normal ,那这第十个和前面的第十个就不一样了。如果这个链条的顺序和设定都是一样的,那就一样。rnorm(10)能确保你连续出十个normal,计算机中间不干别的.如果你保证loop就是连续做十次,结果就应该一致。
m
microsat
你set.seed(42) rnorm(10) 和你之前的rnorm (5)两次比较一下。
再自己思考一下
马佳168 发表于 2022-06-22 19:47

嗯。rnorm(10) [ 6:10] = secod rnorm(5)