Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.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
用消去法掷n个骰子的r码_R - Fatal编程技术网

用消去法掷n个骰子的r码

用消去法掷n个骰子的r码,r,R,我正试图为这个挑战编写一个r代码:假设我们掷n个骰子,移除所有掷到1的骰子,然后再次掷剩余的骰子。如果我们重复这个过程,最终所有的骰子都会被淘汰。我们平均要做多少卷? 这是我迄今为止尝试过的方法,但它不起作用。教科书中5个骰子的理论答案是13.02 代码尝试 N=10000 myfun这里有一个工作脚本,它计算一个模具必须滚动多少次才能生成六个值中的每一个: numRolls <- function() { cnt <- 0 x <- c(1:6) wh

我正试图为这个挑战编写一个r代码:假设我们掷n个骰子,移除所有掷到1的骰子,然后再次掷剩余的骰子。如果我们重复这个过程,最终所有的骰子都会被淘汰。我们平均要做多少卷? 这是我迄今为止尝试过的方法,但它不起作用。教科书中5个骰子的理论答案是13.02

代码尝试
N=10000

myfun这里有一个工作脚本,它计算一个模具必须滚动多少次才能生成六个值中的每一个:

numRolls <- function() {
    cnt <- 0
    x <- c(1:6)
    while (length(x) > 0) {
        rand <- sample(1:6,1,replace = TRUE)   # generate random value 1 to 6
        x <- x[which(x!=rand)]                 # remove this value if not yet seen
        cnt <- cnt + 1                         # increment number of rolls
    }

    return(cnt)
}

totalRolls <- 0

for (i in 1:1000) {
    totalRolls <- totalRolls + numRolls()
}

totalRolls / 1000
[1] 14.819

numRolls这里有一个工作脚本,它计算一个模具必须滚动多少次才能生成六个值:

numRolls <- function() {
    cnt <- 0
    x <- c(1:6)
    while (length(x) > 0) {
        rand <- sample(1:6,1,replace = TRUE)   # generate random value 1 to 6
        x <- x[which(x!=rand)]                 # remove this value if not yet seen
        cnt <- cnt + 1                         # increment number of rolls
    }

    return(cnt)
}

totalRolls <- 0

for (i in 1:1000) {
    totalRolls <- totalRolls + numRolls()
}

totalRolls / 1000
[1] 14.819

numRolls与@TimBiegeleisen的答案相比,这里有一种替代方法

我们定义了一个函数,该函数模拟六面模具的轧制,并返回至少一次获得所有面所需的最小辊数

myfun <- function(Nmax = 10^5) {
    smpl <- sample(1:6, Nmax, replace = T)
    for (n in 1:Nmax) if (length(table(smpl[1:n])) == 6) break;
    return(n)
}

请注意,该值与理论值非常一致

6 * sum(1 / (1:6))
[1] 14.7
因此,结果非常接近,绝对误差百分比为

abs(mean(x) - 6 * sum(1 / (1:6))) / (6 * sum(1 / (1:6))) * 100
#[1] 1.727891

与@TimBiegeleisen的答案相比,这里有一种替代方法

我们定义了一个函数,该函数模拟六面模具的轧制,并返回至少一次获得所有面所需的最小辊数

myfun <- function(Nmax = 10^5) {
    smpl <- sample(1:6, Nmax, replace = T)
    for (n in 1:Nmax) if (length(table(smpl[1:n])) == 6) break;
    return(n)
}

请注意,该值与理论值非常一致

6 * sum(1 / (1:6))
[1] 14.7
因此,结果非常接近,绝对误差百分比为

abs(mean(x) - 6 * sum(1 / (1:6))) / (6 * sum(1 / (1:6))) * 100
#[1] 1.727891
下面是针对上述问题的更新代码
N=10000#模拟次数
种子集(1873)
Noofrollsher是针对上述问题的更新代码
N=10000#模拟次数
种子集(1873)


这两个骰子是不是可以区分?例如,当你说“所有面至少出现一次”时,这是否意味着模具1的“面=3”与模具2的“面=3”不同,并且两者都必须出现?你为什么改变这个问题???这现在是一个非常不同的问题(最初的问题是优惠券收集者问题的一个特例)。这是我的反对票,因为我一直在努力解决你原来的问题。请注意,这里的人愿意提供帮助,并且在一小时后完全改变问题(!)会使任何人在此之前所做的任何尝试无效!对不起,毛里塔尼亚·埃弗斯。我把错误的问题贴错了。我将其更改为针对我试图编写的代码发布正确的问题。您在首次发布后整整一小时(!!)完全更改了问题!这里的事情不是这样的。我真的很讨厌人们这样做,因为这会使其他人已经做过的所有艰苦工作无效。幸运的是,在这种情况下,我能够挽救我最初答案的一部分。这两个骰子是否可以区分?例如,当你说“所有面至少出现一次”时,这是否意味着模具1的“面=3”与模具2的“面=3”不同,并且两者都必须出现?你为什么改变这个问题???这现在是一个非常不同的问题(最初的问题是优惠券收集者问题的一个特例)。这是我的反对票,因为我一直在努力解决你原来的问题。请注意,这里的人愿意提供帮助,并且在一小时后完全改变问题(!)会使任何人在此之前所做的任何尝试无效!对不起,毛里塔尼亚·埃弗斯。我把错误的问题贴错了。我将其更改为针对我试图编写的代码发布正确的问题。您在首次发布后整整一小时(!!)完全更改了问题!这里的事情不是这样的。我真的很讨厌人们这样做,因为这会使其他人已经做过的所有艰苦工作无效。幸运的是,在本例中,我能够挽救部分原始答案。亲爱的Tim,对不起,我编辑了问题以匹配我尝试的代码。你可以看看新的question@AKUGIZIBWEEDWIN您应该仍然能够使用我编写的函数来获得答案。@TimBiegeleisen这与
n*sum(1/(1:n))=14.7的理论值非常接近
n=6
。很好+1…但它并不精确,我预计1000次模拟会更接近。试图找出谁出了错。@TimBiegeleisen嗯,这可能是因为分布非常右偏,1000次模拟是不够的。我添加了一个替代计算,包括一个分布图来说明。亲爱的Tim,很抱歉我编辑了这个问题以匹配我尝试的代码。你可以看看新的question@AKUGIZIBWEEDWIN您应该仍然能够使用我编写的函数来获得答案。@TimBiegeleisen这与
n*sum(1/(1:n))=14.7的理论值非常接近
n=6
。很好+1…但它并不精确,我预计1000次模拟会更接近。试图找出谁出了错。@TimBiegeleisen嗯,这可能是因为分布非常右偏,1000次模拟是不够的。我添加了一个替代计算,包括一个分布图来说明。