很好的问题。出现此行为的原因是当您设置p = 0
or p = 1
in rbinom
,底层 C 函数意识到它不需要使用随机数生成器进行采样。种子仅在调用随机数生成器时更改,因此如果p
严格来说是任何数字between0和1,种子会改变,但是如果p
是 0 或 1 则不会。你可以看到这是源代码 https://github.com/SurajGupta/r-source/blob/master/src/nmath/rbinom.c#L67.
在正常情况下,当 p 大于零或小于 1 时,您的设置应该可以正常工作:
set.seed(1)
x1 <- rbinom(5, 1, 0.4)
y1 <- rbinom(5, 1, 0.5)
set.seed(1)
x2 <- rbinom(5, 1, 0.1)
y2 <- rbinom(5, 1, 0.5)
all(y1 == y2)
#> [1] TRUE
但如果将 p 设置为 1 或 0,结果就会不同:
set.seed(1)
x1 <- rbinom(5, 1, 0.4)
y1 <- rbinom(5, 1, 0.5)
set.seed(1)
x2 <- rbinom(5, 1, 1)
y2 <- rbinom(5, 1, 0.5)
all(y1 == y2)
#> [1] FALSE
为了证明这是正确的,我们应该得到y1 == y2
如果我们设置p
第一次为 1 并且p
第二次为 0:
set.seed(1)
x1 <- rbinom(5, 1, 0)
y1 <- rbinom(5, 1, 0.5)
set.seed(1)
x2 <- rbinom(5, 1, 1)
y2 <- rbinom(5, 1, 0.5)
all(y1 == y2)
#> [1] TRUE