【问题标题】:How random is my shuffle function?我的随机播放功能有多随机?
【发布时间】:2013-08-22 08:39:38
【问题描述】:

我正在编写一个心理学实验,我需要为每个参与者打乱刺激的顺序。我有一个随机排序我的刺激的函数,然后我的程序从 .txt 文件中读取。样本中默认使用的伪随机算法(如下面我的“洗牌”函数所示)是否充分洗牌,以实际预期不会在课程中的任何刺激位置或刺激位置模式中产生任何系统偏差实验次数(4500 次试验)?

stimulus <- c("a", "b", "c", "d", "e")
shuffle <- function (x) { as.data.frame(sample((t(x)))) } 
shuffle (stimulus)

【问题讨论】:

  • 我忍不住建议结果严重偏向字母表的开头 :-)

标签: r random


【解决方案1】:

我会说是的,你可以用图表表示。如果它真的是随机的,我们会期望在每个位置以随机顺序均匀分布值,所以让我们重复这个实验并绘制结果图......

#  Repeat experiment 10,000 times
res <- replicate( 10000 , shuffle(stimulus) )
out <- do.call( rbind , res )

#  Plot
par( mfrow = c( 3 , 2 ) )
for( i in 1:ncol(out)){
  hist( out[,i] , main = paste0("Values at position: " , i ) )
}

每个直方图是每个位置的值分布。 5 个位置,所以 5 个直方图。每个位置的可能值分布均匀,所以我想说您的值以均匀的概率分配给每个位置(这是sample 的默认值)。

【讨论】:

  • 我相信没有替换的采样(使用sample)并且不指定概率将导致Fisher-Yates shuffle算法。这是因为在对每个值进行采样后,它会重新归一化概率(在这种情况下是均匀的)并从剩余的可用概率中采样。这意味着每个排列的概率相等。
【解决方案2】:

R 中的随机数生成器非常出色——该语言是针对统计学家的。几点。

  1. 有关所使用的随机数生成器的详细信息,请参阅?RNG

  2. 使用set.seed 使您的改组可重现

    set.seed(1)
    
  3. 您可以将代码简化为:

    stimulus = c("a", "b", "c", "d", "e")
    data.frame(sh=sample(stimulus))
    

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多