我正在尝试骰子滚动模拟。模拟的目的是生成六个值的向量,每个值的元素是3个六面骰子的总和。我正在尝试使用while循环来反映两个条件:向量的总和应该大于提供的值并且最大元素值应该大于阈值。
我尝试使用&
和&&
,更改参数的顺序等等......但是每次迭代时代码只执行一个条件,即总数大于提供的值。
我已阅读this post,但它没有帮助。
代码:
random.stats=function(threshold,roll){
require(random)
temp=rep(0,6)
j=0
while(sum(temp)<threshold && max(temp)<roll){
for(i in 1:6){
temp[i]=sum(sort(randomNumbers(n=5,min=1,max=6,col=1),
decreasing=TRUE)[1:3])
}
j=j+1
}
return(list(rolls=temp,total=sum(temp),required.iterations=j))
}
示例有问题的函数调用是random.stats(70,18)
。我的总价值总是超过70,但只有偶然获得18,大约5%的时间。
for循环用于对卷进行加权,模拟滚动5个六面骰子并仅使用3个最高值。
任何人都可以帮助解决此流量控制问题吗?
编辑:每种条件的概率密度分别为:
答案 0 :(得分:4)
你的while循环中有错误的条件。考虑案例
roll = c(14, 17, 14, 10, 15, 14)
sum(roll) = 84
max(roll) = 17
现在,只有sum<70
和max<18
同时观察
sum(roll)<70 & max(roll)<18
== FALSE & TRUE
== FALSE
所以你的循环不会再次运行。它仅在TRUE
时运行。你真正想要的是一个“OR”(|
)
while ( sum(temp)<threshold | max(temp)<roll )