大域変数の扱いと R の配列の添え字が 1 から始まることに注意が必要です。
以下のようになりました。
u.dist <- function(n1=10, n2=10)
{
increment <- function(s, n)
{
for (i in 0:n) {
p[s+i+1] <<- p[s+i+1]+1
}
}
u <- function(n, m, begin, end)
{
if (n == 1 || m == 1) {
increment(begin, end-begin)
}
else {
u(n-1, m, begin, begin+(n-1)*m)
u(n, m-1, end-n*(m-1), end)
}
}
if (n1 > 10 && n2 > 10) {
stop("死ぬほど時間がかかるかも知れません")
}
total <- choose(n1+n2, n2)
p <- rep(0, n1*n2+1)
u(n1, n2, 0, n1*n2)
cat("n1 = ", n1, ", n2 = ", n2, "\n")
cat (sprintf("%5s %5s %10s %10s %10s\n", "U", "freq.", "p", "cum p", "cum p2"))
cum1 <- 0
cum2 <- 1
for (i in 0:(n1*n2)) {
cp <- p[i+1]/total
cum1 <- cum1+cp
cat(sprintf("%5i %5i %10.5f %10.5f %10.5f\n", i, as.integer(p[i+1]), cp, cum1, cum2))
cum2 <- cum2-cp
}
}
> u.dist(5,3)
n1 = 5 , n2 = 3
U freq. p cum p cum p2
0 1 0.01786 0.01786 1.00000
1 1 0.01786 0.03571 0.98214
2 2 0.03571 0.07143 0.96429
3 3 0.05357 0.12500 0.92857
4 4 0.07143 0.19643 0.87500
5 5 0.08929 0.28571 0.80357
6 6 0.10714 0.39286 0.71429
7 6 0.10714 0.50000 0.60714
8 6 0.10714 0.60714 0.50000
9 6 0.10714 0.71429 0.39286
10 5 0.08929 0.80357 0.28571
11 4 0.07143 0.87500 0.19643
12 3 0.05357 0.92857 0.12500
13 2 0.03571 0.96429 0.07143
14 1 0.01786 0.98214 0.03571
15 1 0.01786 1.00000 0.01786