为大数的组合编写一个 matlab 程序



因为对于大数的组合有时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 中的函数。

要计算一次k n对象的组合数,可以使用gammaln来计算阶乘的对数以避免溢出:

result = exp(gammaln(n+1)-gammaln(k+1)-gammaln(n-k+1));

另一种方法是删除将取消的项,然后计算结果:

result = prod((n-k+1:n)./(1:k));

相关内容

最新更新