Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中样本函数随机种子的确定_R_Random_Random Seed - Fatal编程技术网

R中样本函数随机种子的确定

R中样本函数随机种子的确定,r,random,random-seed,R,Random,Random Seed,我想知道如何修复R中样本函数的随机种子 一个简单的例子如下: set.seed(1) tmp <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) sample(tmp, size = 3) # (*) #[1] 9 4 7 sample(tmp, size = 3) # (**) #[1] 1 2 5 sample(tmp, size = 3) # (***) #[1] 7 2 3 sample(tmp, size = 3)

我想知道如何修复R中样本函数的随机种子

一个简单的例子如下:

set.seed(1)
tmp <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
sample(tmp, size = 3)       # (*)
#[1] 9 4 7
sample(tmp, size = 3)       # (**)
#[1] 1 2 5
sample(tmp, size = 3)       # (***)
#[1] 7 2 3
sample(tmp, size = 3)       # (****)
#[1] 3 1 5

# retry set the random seed
set.seed(1)
sample(tmp, size = 3)       # (*)
#[1] 9 4 7
sample(tmp, size = 3)       # (**)
#[1] 1 2 5
sample(tmp, size = 3)       # (***)
#[1] 7 2 3
sample(tmp, size = 3)       # (****)
#[1] 3 1 5
set.seed(1)

tmp像这样的事情可能是

{set.seed(1); sample( tmp, 3 )}

[1] 9 4 7

无论何时调用,这都会返回相同的结果。我认为你的帖子回答了这个问题。如果您注意到设定种子后的第一个样本是相同的,这是它预期要做的:

set.seed(1)
tmp <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
sample(tmp, size = 3)
[1] 9 4 7
sample(tmp, size = 3)
[1] 1 2 5

set.seed(1)
tmp <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
sample(tmp, size = 3)
[1] 9 4 7
sample(tmp, size = 3)
[1] 1 2 5

您的问题似乎反映了对伪随机数生成器(PRNG)和种子的基本误解。PRNG保持包含固定位数的内部状态,并通过应用确定性函数从当前状态前进到下一状态。该函数确定基于状态的输出序列看起来是多么“随机”,即使它实际上不是随机的(因此是伪前缀)。给定一个固定的比特数,算法最终将重复其内部状态,此时整个序列将重复,因为它是确定性的。这样做所需的时间称为PRNG的周期长度

一旦你意识到所有的PRNG最终都会重复它们的序列,你就很容易看到一个种子除了提供一个进入循环的入口点之外,什么也不做。很多人错误地认为种子会影响PRNG的质量,但这是错误的。质量基于确定性转换函数,而不是种子

那么为什么PRNG允许您指定一个种子呢?基本上是为了再现性。首先,如果无法重现暴露错误的数据,那么调试程序就非常困难。使用相同的种子重新运行将允许您跟踪导致问题的任何原因。其次,这允许对替代系统进行更公平的比较。假设您想比较当您添加一个额外的职员或出纳员时,杂货店或银行的工作方式。如果通过控制种子设定使用同一组客户和客户事务运行这两种配置,则这些配置之间的差异可直接归因于系统配置中的更改。在不控制播种的情况下,序列的随机性可能会减弱或放大差异。是的,从长远来看,这将通过采取更大的样本得出,但关键是你可以通过巧妙地使用种子而不是增加样本量来减少答案的差异


底线-您的示例完全按照预期工作。当以相同的方式采样时,重置种子会产生相同的随机序列。

您的问题有点令人困惑。你表现出的是预期的行为。如果希望每个
sample(tmp,size=3)
返回与我理解的每次调用
sample
之前设置种子所需的值相同的值,
set.seed()
“初始化”当前随机数生成器的状态。对随机数生成器的每次调用都会更新其状态。因此,每次调用
sample()
都会为生成器生成一个新状态。如果希望每次调用
sample()
都返回相同的值,则需要在每次调用
sample()
之前调用
set.seed()
。您发布的行为是预期的。
set.seed(1)
tmp <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
sample(tmp, size = 6)
[1] 9 4 7 1 2 5