修改R代码以生成差异输出

时间:2019-03-12 05:38:36

标签: r

set.seed(2019)
numHeads <- t(replicate(1000, sample(1:0, 4, TRUE)))
mean(rowSums(numHeads)

我需要修改此代码,以便我们可以将现在的10000枚硬币重复扔一次,直到获得正面,然后找到该实验的经验平均值。

2 个答案:

答案 0 :(得分:0)

平均来说,他要掷1.9圈才能获得正面。关键是while语句,它将一直运行直到条件为真(在这种情况下,您得到的不是0)。对象“ Count”只是要选择1的while循环必须运行多少次。

out <- NULL
for( i in 1:10000){

    count<-0
    a <- 0

    while( a == 0 ){

        set.seed(count+i)
        a <- sample( c(0,1) ,1  )
        count <- count+1

    }

    out <- rbind( out , data.frame( i, count))
}

mean( out$count)

答案 1 :(得分:0)

这是重复(Nrepeat = 100次抛硬币Ntoss = 10^5次的矢量化方法。

Ntoss <- 10000
Nrepeat <- 100
set.seed(2018)
lst <- replicate(Nrepeat, sample(c(TRUE, FALSE), Ntoss, replace = T), simplify = F)

这里的输出对象是一个list,每重复一次抛硬币“实验”就产生10^5抛硬币结果。

抛掷10^5硬币中的正面数

要计算10^5抛硬币中的正面数目,可以做到

nHeads <- sapply(lst, sum)

10^5硬币抛掷中头部乱动

要计算您可以进行的10^5抛硬币中正面的比例

fracHeads <- sapply(lst, function(x) sum(x) / length(x))
# [1] 0.5071 0.5027 0.5033 0.4969 0.5010 0.5010 0.5053 0.4994 0.5027 0.4974
#[11] 0.4937 0.5012 0.5018 0.5006 0.5066 0.4986 0.4987 0.5030 0.4990 0.5050
#[21] 0.4889 0.4986 0.5040 0.4933 0.5002 0.4912 0.4966 0.5046 0.4942 0.5029
#[31] 0.4908 0.5014 0.5002 0.5061 0.5013 0.5051 0.4977 0.4957 0.4990 0.5054
#[41] 0.5086 0.4994 0.4910 0.5032 0.4961 0.4928 0.5108 0.5018 0.5040 0.4973
#[51] 0.5001 0.4989 0.5069 0.5004 0.4946 0.4980 0.4970 0.4988 0.4945 0.4972
#[61] 0.5106 0.5016 0.4932 0.4989 0.4983 0.4969 0.4938 0.5063 0.4962 0.5073
#[71] 0.5020 0.4904 0.4990 0.5025 0.4990 0.4949 0.5009 0.4986 0.4959 0.4886
#[81] 0.4972 0.5055 0.5046 0.5059 0.4980 0.4993 0.4975 0.4959 0.4943 0.5077
#[91] 0.5021 0.5023 0.4977 0.5034 0.4943 0.5056 0.5019 0.5051 0.4980 0.5031

头部的分布

我们还可以绘制100个重复实验中头部的比例分布图

library(ggplot2)
ggplot(data.frame(fracHeads = fracHeads), aes(fracHeads)) +
    geom_histogram(bins = 20)

enter image description here