2016-07-21 77 views
3

給定兩個硬幣,結果的數量將是2^2(兩個硬幣只有兩種可能性(head(up) 。或尾部(向下))給出以下可能的組合:如何生成兩種硬幣的所有可能的組合,並且有三種可能性(上,下和中間)

00 
01 
10 
11 

其中,0意味着頭部(向上)和1指尾部(向下)

這裏是打印先前的組合的代碼:

for n=1:2^2 
r(n) = dec2bin(n); 
end 

我想要做的是打印相同的兩個硬幣的所有可能的組合,但有三種不同的可能性(頭(上),尾(下)和中間(不上或下)) 像:

00 
01 
10 
11 
0B 
B0 
B1 
1B 
BB 

其中,B意味着兩個硬幣之一在之間(不向上或向下)

什麼想法?

+1

請選擇一種語言,而不是它們的列表。 – PaulMcKenzie

+0

我在問任何使用這4種語言的想法。我可以使用這四種語言中的任何一種,以防周圍有誰知道解決方案但使用其中的一種。感謝您的通知。希望你有美好的一天。 –

+0

在Matlab中,您可以使用[this](http://stackoverflow.com/questions/21895335/generate-a-matrix-containing-all-combinations-of-elements-taken-from-n-vectors)和輸入向量= {[0 1 2] [0 1 2]}'或'vectors = {'01B''01B'}' –

回答

2

Python的溶液:

from itertools import product 

possible_values = '01B' 
number_of_coins = 2 

for result in product(possible_values, repeat=number_of_coins): 
    print(''.join(result)) 

# Output: 
# 00 
# 01 
# 0B 
# 10 
# 11 
# 1B 
# B0 
# B1 
# BB 
+0

這很快。它工作正常。非常感謝。 –

1
from itertools import product 

outcomes = ["".join(item) for item in list(product('01B', repeat=2))] 
for outcome in outcomes: 
    print(outcome) 
#reusults: 
00 
01 
0B 
10 
11 
1B 
B0 
B1 
BB 
1
Matlab的

解決方案: n是可能的解決方案的量。在你的情況3不同的一次。 k是集合的數量。在你的情況2個硬幣。 p應該包含結果矩陣。

n = 3; k = 2; 
nk = nchoosek(1:n,k); 
p=zeros(0,k); 
for i=1:size(nk,1), 
    pi = perms(nk(i,:)); 
    p = unique([p; pi],'rows'); 
end 

更多的解決方案檢查:Possible combinations - order is important

+0

感謝Colden,但是這段代碼沒有提供所有的組合,它工作正常,但仍然有三分之一的組合缺失。 –

1

我發現MATLAB幾種解決方案。 (這不完全是我的代碼,我找到了一些部分,並適應它)。發佈它,因爲@C.Colden' answer未滿。 你想達到的是permutations with repetitions。科爾登顯示它沒有重複。所以,你可以走這條路:

解決方案1:

a = [1 2 3] 
n = length(a) 
k = 2 
for ii = k:-1:1 
    temp = repmat(a,n^(k-ii),n^(ii-1)); 
    res(:,ii) = temp(:); 
end 

結果:

res = 

1  1 
1  2 
1  3 
2  1 
2  2 
2  3 
3  1 
3  2 
3  3 

和有趣解決方案2,如果你需要它以字符串形式:

dset={'12b','12b'}; 
n=numel(dset); 
pt=[3:n,1,2]; 
r=cell(n,1); 
[r{1:n}]=ndgrid(dset{:}); 
r=permute([r{:}],pt); 
r=sortrows(reshape(r,[],n)); 

結果:

r = 

11 
12 
1b 
21 
22 
2b 
b1 
b2 
bb 
+1

非常感謝米哈伊爾,這真的很有幫助。這兩種解決方案運行良好,非常好。非常感謝。 –

0

准許我對這些其他語言的語法不熟悉,對它們的解決方案看起來過於複雜。

這只是一個簡單的雙嵌套循環for

C++

#include <iostream> 
using namespace std; 

int main() 
{ 
    const char* ch = "01B"; 
    for (int i = 0; i < 3; ++i) 
    { 
     for (int j = 0; j < 3; ++j) 
      cout << ch[i] << ch[j] << '\n'; 
    } 
} 

輸出:

00 
01 
0B 
10 
11 
1B 
B0 
B1 
BB 
+0

嗨保羅,感謝您分享代碼。 是的,你的解決方案是非常簡單的,但它只適用於你只有兩個硬幣(由兩個嵌套循環表示),這正是在這個問題的情況下,但這裏的gentles提供的其他代碼有可能打印所有任何數量的硬幣的組合,它也很簡單。希望你今天過得愉快! –