因为对于matlab回复NaN
的大数组合,分配是编写一个程序来计算200 objects taken 90 at a time
的组合。一旦这个工作,我们将把它变成一个函数y = comb(n,k
)。
这是我到目前为止基于一个例子,我们得到了一个班级中2个人有相同生日的可能性。
这是一个例子:
nMax = 70; %maximum number of people in classroom
nArray = 1:nMax;
prevPnot = 1; %initialize probability
for iN = 1:nMax
Pnot = prevPnot*(365-iN+1)/365; %probability that no birthdays are the same
P(iN) = 1-Pnot; %probability that at least two birthdays are the same
prevPnot = Pnot;
end
plot(nArray, P, '.-')
xlabel('nb. of people')
ylabel('prob. that at least two have same birthday')
grid on
此时我遇到了麻烦,因为我对java比较熟悉。这就是我到目前为止所做的,而且根本就没有出来。
k = 90;
n = 200;
nArray = 1:k;
prevPnot = 1;
for counter = 1:k
Pnot = (n-counter+1)/(prevPnot*(n-k-counter+1);
P(iN) = Pnot;
prevPnot = Pnot;
end
我写的循环的要点是将每个术语分开
即n/k*(n-k)
,时间(n-counter)/(k-counter)*(n-k-counter)
,等等。
我也不完全确定如何将循环保存为matlab中的函数。
答案 0 :(得分:1)
要计算一次n
个k
个对象的组合数,可以使用gammaln
来计算阶乘的对数,以避免溢出:
result = exp(gammaln(n+1)-gammaln(k+1)-gammaln(n-k+1));
另一种方法是删除将取消然后计算结果的术语:
result = prod((n-k+1:n)./(1:k));