2010-05-23 20 views
5

Trong trường hợp trật tự quan trọng, việc tạo ma trận của tất cả các kết quả có thể là khá dễ dàng. Một cách để thực hiện việc này là sử dụng expand.grid như được hiển thị here.Tạo ma trận của tất cả các kết quả có thể để ném xúc xắc (bỏ qua thứ tự)

Điều gì sẽ xảy ra nếu không?

Nếu tôi đúng, số lượng kết hợp có thể là (S+N-1)!/S!(N-1)!, trong đó S là số súc sắc, mỗi con có N cạnh từ 1 đến N. (Khác với công thức kết hợp nổi tiếng vì có thể cùng một số xuất hiện trên nhiều hơn một con xúc xắc). Ví dụ, khi ném bốn con xúc xắc sáu mặt, N = 6 và S = 4, vì vậy số lượng các kết hợp có thể là (4 + 6-1)!/4! (6-1)! = 9!/4! X5! = 126. Làm thế nào tôi có thể tạo ra một ma trận của 126 kết quả này?

Cảm ơn bạn.

+0

Được gắn thẻ lại để thêm xúc xắc và thuật toán. –

Trả lời

5

Đây là mã mà gd047 và Marek đủ tử tế để cung cấp.

S <- 6 
N <- 4 
n <- choose(S+N-1,N) 
outcomes <- t(combn(S+N-1,N,sort)) - matrix(rep(c(0:(N-1)),each=n),nrow=n) 

Lưu ý: điều này là tối ưu theo nghĩa là nó không cố gắng tạo ra tất cả và sau đó vứt bỏ hai lần. It actually generates only those that are required.

Giải thích về lý do tại sao nó hoạt động:

Những con số có thể trên con xúc xắc là 1 đến N.

Giả sử bạn có một sự kết hợp có thể có của những con số xúc xắc: x , x , ..., x S trong đó S là số súc sắc.

Kể từ thứ tự không quan trọng, chúng ta có thể giả định rằng

x ≤ x ≤ ..., ≤ x S.

Bây giờ xem xét các chuỗi x , x + 1, x + 2, ..., x S + S-1.

(Ví dụ: 1,1,1 trở thành 1,1 + 1,1 + 2 = 1,2,3).

Chuỗi mới này có các số từ 1 đến N + S-1 và tất cả các số đều khác nhau.

Ánh xạ này từ chuỗi xúc xắc của bạn đến chuỗi mới mà chúng tôi đã tạo là 1-1 và dễ dàng đảo ngược.

Vì vậy, để tạo ra sự kết hợp có thể của xúc xắc S với số từ 1 đến N, tất cả những gì bạn cần làm là tạo tất cả N + S-1 Chọn S kết hợp các số S từ 1, 2, ..., N + S-1. Với sự kết hợp như vậy, bạn sắp xếp nó, trừ 0 từ nhỏ nhất, 1 từ nhỏ nhất thứ hai trở lên để kết hợp số xúc xắc của bạn cho S xúc xắc được đánh số 1 đến N.

Ví dụ, giả sử N = 6 và S = 3.

Bạn tạo kết hợp 3 số từ 1 đến 6 + 3-1 = 8, tức là 3 số từ 1,2, ..., 8.

Giả sử bạn nhận được 3,6,7. Điều này dịch sang 3, 6-1, 7-2 = 3,5,5.

Nếu bạn có 1,2,8. Điều này sẽ chuyển thành 1,1,6.

Ngẫu nhiên, ánh xạ này cũng chứng minh công thức bạn có.

+0

@Moron Bạn nói đúng !. Tôi đã đăng trước khi đọc câu trả lời của bạn, nhận thấy rằng không có mã trong đó. Không có nghi ngờ bạn trả lời đầu tiên, vì vậy tôi đang thêm mã của tôi như là một bình luận cho câu trả lời của bạn. S <- 6 N <- 4 n <- chọn (S + N-1, N) kết quả <- t (áp dụng (combn (S + N-1, N), 2, sort)) - ma trận (đại diện (c (0: (N-1)), mỗi = n), nrow = n) –

+0

@ gd047. Ok, tôi đã chỉnh sửa câu trả lời của tôi để thêm mã của bạn. Vui lòng chỉnh sửa câu trả lời nếu bạn cảm thấy cần bất cứ điều gì. –

+1

Đây là câu trả lời rất toàn diện. Một mẹo cho mã: 'combn' có thể áp dụng một hàm cho mỗi kết hợp, do đó,' áp dụng (combn (S + N-1, N), 2, sort) 'có thể được thay thế bằng' combn (S + N-1, N, sắp xếp) '. – Marek

1

Generaly bạn cần phải đặt từng kết quả từ gốc expand.grid và sau đó unique họ, ví dụ như sử dụng được áp dụng:

X <- expand.grid(1:6,1:6,1:6,1:6) 
dim(unique(t(apply(X,1,sort)))) 
#[1] 126 4 

Nhưng bạn có thể được khôn lanh và chọn tập hợp con của tất cả các kết quả mà được sắp xếp:

X <- expand.grid(1:6,1:6,1:6,1:6) 
dim(subset(X, Var1>=Var2 & Var2>=Var3 & Var3>=Var4)) 
# [1] 126 4 

Phiên bản thứ hai nhanh hơn nhiều.

+0

+1 câu trả lời rất thông minh! – nico