本篇笔记在本人CSDN博客浏览效果更佳,点此链接跳转,欢迎批评指正
这是我在完成一道R语言使用例题的过程中产生的思考,这道题我错误的原因在于对二项式公式的不理解以及对所用的choose函数的不理解,所以本文以这道题为例,介绍我对R语言中二项式分布计算实现的理解。
题目为“1,2,3,4四个数字可以组合成多少个不同的且不能重复的三位数”
我最初的想法是可以直接用choose函数计算组合。
也就是直接用如下这一行代码即可
choose(4,3)
计算结果是4,而不是正确的24。犯了该错误的原因在于我对choose函数的使用以及排列组合不太了解。
首先,关于choose函数,在R自带的help文档中,对choose函数的使用介绍如下
Note that choose(n, k) is defined for all real numbers n and integer k. For k ≥ 1 it is defined as n(n-1)…(n-k+1) / k!, as 1 for k = 0 and as 0 for negative k. Non-integer values of k are rounded to an integer, with a warning.
choose(*, k) uses direct arithmetic (instead of [l]gamma calls) for small k, for speed and accuracy reasons. Note the function combn (package utils) for enumeration of all possible combinations.
需要注意的是,choose(n,k)函数需要由实属n和整形k所定义。对于任意一个k大于等于1的情况,这个函数将被定义为n(n-1)…(n-k+1) / k!
我们可以发现,其实这就是二项式分布里的Ckn我们可以发现,其实这就是二项式分布里的C_n^k
我们可以发现,其实这就是二项式分布里的C(n,k)
为什么直接用这个公式不可以呢?因为在题目的条件下,应该要考虑排列的顺序,123,132,231,213应当记作四次,但是在choose函数中只会被记作一次。
也就是说,其实这里要用的公式应该是二项式分布里的A(n,k),应该用排列的公式计算。所以正确答案应该是
choose(4,3)*factorial(3)
要再乘上3个因素。这里的factorial函数又起到了怎样的作用呢?
factorial(x) (x! for non-negative integer x)
做非负整数x的阶乘。所以再乘上factorial(3)就没错了,乘上3!从算组合的公式变成算排列的公式。
上述是只算“1,2,3,4四个数字可以组合成多少个不同的且不能重复的三位数”个数的方法,如果要展示每种组合的情况,该如何计算?
n = 0
for(i in c(1,2,3,4)){
for(j in c(1,2,3,4)){
for(k in c(1,2,3,4)){
if(i != j && j!= k &&i!=k){
num = paste(i,j,k,sep = " ")#paste是连接字符串的命令,sep是连接的分隔符
print(num)#显示可有的组合
n = n+1
}
}
}
}
n
我这里选择了三次循环嵌套的方法计算,num用来显示各种情况,n用来计数。从1到4依次选择组合,并排除数字重复的情况。这里的paste函数是连接字符串的命令,sep是连接的分隔符。
以上是我对问题“1,2,3,4四个数字可以组合成多少个不同的且不能重复的三位数”的解答,在解决这个问题的过程中我的老师给了我很多帮助,文末感谢老师。
如果本文表述有误,或有更好的方法,欢迎批评指正。
————————————————
版权声明:本文为CSDN博主「纸羊同学」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46124302/article/details/104656209