循环不工作时的两个条件

时间:2014-05-25 01:03:07

标签: r

我正在尝试骰子滚动模拟。模拟的目的是生成六个值的向量,每个值的元素是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个最高值。

任何人都可以帮助解决此流量控制问题吗?

编辑:每种条件的概率密度分别为:

Probability of 5 six sided dice subtracting the two lowest

Cumulative probability of vector sum

1 个答案:

答案 0 :(得分:4)

你的while循环中有错误的条件。考虑案例

roll = c(14,  17,  14,  10,  15, 14)
sum(roll) = 84
max(roll) = 17

现在,只有sum<70max<18同时观察

才能运行
sum(roll)<70 & max(roll)<18 
    == FALSE & TRUE 
    == FALSE

所以你的循环不会再次运行。它仅在TRUE时运行。你真正想要的是一个“OR”(|

while ( sum(temp)<threshold | max(temp)<roll )