计算滚动两个骰子的优雅解决方案?

时间:2016-07-04 04:09:31

标签: r

我正在计算我在R中使用100次的两个骰子的每个角色得到相同的结果。我使用过

werFun <-  function() {
 return(sample(1:6,2,TRUE))
}
count <- 0
matResult <- matrix(0,100,2)
for (i in 1:nrow(matResult)) {
  matResult[i,] <- werFun()
   if(matResult[i,1]==matResult[i,2]){
    count=count+1
 }
}  
print(count)

有优雅的解决方案吗?

3 个答案:

答案 0 :(得分:4)

试试这个

matResult <- matrix(replicate(100,sample(1:6,2,TRUE)),ncol = 2,byrow = T)
nrow(matResult[matResult[,1]==matResult[,2],])

另一种解决方案也适用于n骰子。

sum(apply(matResult,1,var)==0)

答案 1 :(得分:3)

要正式化我的评论,您可以使用 <a th:href="@{/greeting/{id}/delete(id=${greeting.id})}" th:text="delete"></a> @RequestMapping(value="/greeting/{id}/delete",method=RequestMethod.GET) public String deleteGreeting(@PathVariable int id) { gr.delete(id); return "redirect:/greeting/list"; } 模拟回滚,并使用 <a th:href="@{/greeting/{id}/edit(id=${greeting.id})}" th:text="edit"></a> @RequestMapping(value="/greeting/{id}/edit",method=RequestMethod.GET) public String Edit(@PathVariable int id){ greeting greetingob = gr.findOne(id); return "edit"; } 模拟重复。结合这两个,你得到一个矩阵。如果您将该矩阵转置并强制转换为data.frame,您可以在其上调用git status ,这将巧妙地向您显示您所获得的卷数:

sample

如果你想要对角线,骰子彼此相等,可以通过将调用包裹在replicate中来抓住它:

table

总结一下,你将获得骰子相等的掷骰数量:

set.seed(47)    # for reproducibility 

table(data.frame(t(replicate(100, sample(1:6, 2, TRUE)))))
##    X2
## X1  1 2 3 4 5 6
##   1 3 0 4 5 2 1
##   2 2 5 0 1 5 2
##   3 1 3 3 0 3 3
##   4 3 4 1 3 3 7
##   5 6 0 3 1 4 3
##   6 3 3 4 2 7 0

请注意,每次调用它时都会重新采样,因此除非您设置数字生成器种子,否则数字会有所不同。

答案 2 :(得分:2)

如果你真的不需要矩阵来存储所有的滚动历史记录,你可以计算出去的时间,这可能为你节省时间和内存:

sum(sapply(1:100, function(i) {vec <- werFun(); vec[1] == vec[2]}))

这与您的模拟过程基本相同。话虽如此,如果你已经matResult已经简化了对应部分:

count = sum(matResult[,1] == matResult[,2])