• ベストアンサー

同じものを含む順列

連続する16個の数字から、4つ取り出してその組合せを全て表す処理を作ろうとしています。 まずは意味からと思い、いろいろ検索して調べても、うまく理解できず、最後の手段でここに投稿いたします。 組合せのパターンを割り出すのに、「同じものを含む順列」を使って行うと言われています。 いろいろ調べて混在したものが、意味の違いの点?で、「同じものを含む順列」と「重複順列」とは同じことを表すのでしょうか。 また、「同じものを含む順列」のパターン出力のプログラムを作る必要があり、参考になるサンプルが存在するなら教えていただけないでしょうか。 (順列や組合せは見つかったのですが) 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kakkysan
  • ベストアンサー率37% (190/511)
回答No.1

「同じものを含む順列」 例えば:aaabbcc の様にa3個、b2個、c2個が同じである9文字の順列。(aacbcab…等々) 「重複順列」 例えば a、b、cを繰り返し使用する事を許可して、5個並べる。(aaabbでも良いし、aaaaaでも良いし…etc) >連続する16個の数字から、4つ取り出してその… その4個が全て異なるなら、単なる組み合わせ。 4個の内に同じ物があっても良い場合は、組み合わせと重複順列。(ものすごく難しそうな予感がします)

yamashin_0417
質問者

お礼

"kakkysan"さん、ありがとうございます。 だいぶ「同じものを含む順列」と「重複順列」の違いが整理できて来ました。 そうなると、私の今抱えている課題が「同じものを含む順列」なので、続けて質問した内容が、考え違いをしているようです。 出してもらった例に置き換えて考え直すと、 aabbcccccccccccc(a:2個,b:2個,c:12個) 上記の文字列を「同じものを含む順列」の考えで、全ての組合せパターンを出すための処理を考えればよいことになるようです。 しかし、順列の処理は参考になるサンプルソースが見つかりましたが、「同じものを含む順列」で処理するためのサンプルソースが見つかりません。 こちらの件も解りましたらアドバイスをいただければと思います。

その他の回答 (2)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.3

●「16通りの選択肢のなかから4つを選んで、選んだ順に並べる。ただし、同じ選択肢を何度選んでも良い。」というのが重複順列で、 1個目の選び方=16通り 2個目の選び方=16通り 3個目の選び方=16通り 4個目の選び方=16通り ですから 16^4 (16の4乗)通り。これを全て生成するには for h=1 to 16   for i=1 to 16     for j=1 to 16       for k=1 to 16         output(h, i, j, k)       rof     rof   rof rof てな具合です。「連続する16個の数字から、4つ取り出してその組合せを全て表す処理」と仰っているのは、おそらくこのことでしょう。 ●「同じものを含む順列」? そういう用語は聞いた事がない。用語の意味が定まっておらず、いろんな解釈が可能です。 ご意見1. 重複順列と同じ事だ。 ご意見2. いーや違う。選んだ4個の中に必ず「同じものを含む」のでなくては駄目だ。例えば(a,b,c,d)という選び方は同じものを含まないから駄目。つまり、上記の重複順列16^4通りのうち、4つが全部異なっているような選び方を除いたもののことだ。 ご意見3. いーやそうじゃない。例えば(a,a,a,a)という選び方は全然順列っぽくないではないか。だから、上記の重複順列16^4通りのうち、選んだ4つが全部同じ選択肢のものは除外するんだ。 ご意見4. 違う違う。選んだ4つが全部異なっているような選び方も、4つとも同じ選択肢であるものも、どっちも除くんだ。  他にもいっぱい考えられます。こういった、いろんな別の話を「同じものを含む順列」という言葉で指す可能性があるから、「同じものを含む順列」と言っただけでは意味不明なんです。  ですから、念のため、簡単な例題でご質問の意味を確認してはどうでしょうか。 例題1:選択肢 a, b, cの中から、2つ取り出して、その組合せを全て書け。 例題2: 選択肢 a, b, cの中から2つ取り出すとき、「同じものを含む順列」のパターンを全て書け。  yamashin_0417さんが、これらの例題の答を手作業で書き出して戴けないでしょうか。そうすれば、何をなさりたいのかがはっきりするでしょう。

  • kakkysan
  • ベストアンサー率37% (190/511)
回答No.2

No.1です 4個の内に同じ物があっても良い場合は、組み合わせと重複順列。(ものすごく難しそうな予感がします)…撤回します 4^16通りですね

関連するQ&A

  • 同じものを含む順列について

    センター受験を控えている学生です。 回答を見ていますが、理解できませんので教えていただきたいと思い投稿しました。 1,2,3,4のうちから重複を許して6個の数学を選び、それを並べて順列を考える。 1)2種類の相違なる数字が、一方は2個、他方が4個であるのは、***通りある。2種類の相違なる数字が3個ずつであるのは、***通りある。 2)3種類の相違なる数字が2個ずつあるのは、***通りある。 3)どの数字もそれ以外の5つの数字のどれかに等しいのは、***通りある。 お解りになる方、宜しくお願いします。

  • ※ マクロ問題 順列の列挙 マクロで教えてください

    マクロの初心者です。初心者でも分かるようなシンプルなプログラムで考えていただけませんか?自分なりに組んでみたのですがイマイチ上手く作動しません。色んな書き方があるとは思いますが、色んな考えかた(プログラムの書き方)を聞いてみたいと思って投稿させていただきました。 問1) 10個の中から、6個取る重複順列を列挙するプログラムをマクロで、書くとどうなるでしょうか? 問2) 8個の中から、5個取る重複順列を列挙するプログラムをマクロで、書くとどうなるでしょうか? よろしくお願いします。

  • 昇順のみの順列のパターン(?)

    皆様 こん○○わ。 早速ですが、質問させていただきます。 1~10の数字があるとします。 この中から、 1個取り出す組み合わせは当然10パターンですが、 質問させていただくのは2個以上取り出すパターンで、 1つ目の数字より低い数字は選べない場合の組み合わせなのです。 1 3はOKですが、3 1はダメです。 その場合の2個取り出すパターン~9個取り出すパターンの合計を 求めたいのです。 例: 1 2 2 3 5 4 7 9 10 5 6 7 8 9 10 3 5 6 7 8 9 10 ・ ・ などです。 このようなパターンを作成するプログラムを組んだのですが、 答え合わせができず困っております。 もし、お時間ある方いらっしゃったらお答えいただけると 幸いです。 よろしくお願い申し上げます。

  • 順列生成アルゴリズムについて仕組みを教えてください

    ある本を参考に順列を出力するプログラムをJavaScript用に書き直しました。 上手く動いたのですが、どうして、順列を出力できるのか理解できません。 まず、プログラムは以下になります。 <script> // 対象の配列 var array = [0,1,2,3]; // 配列の数 var N = array.length; // 順列を出力するプ関数 function permutation( n ) { // テンポラリー用 var temp; // 順列を生成する処理部分 if ( n < N ) { for ( var i = n; i < N; i++ ) { // (1)対象の配列から数字を一つ取り出して、他の数字と入れかえる temp = array[n]; array[n] = array[i]; array[i] = temp; // (2)再起呼び出し permutation( n + 1 ); // (3)入れ替えた数字を元に戻す temp = array[n]; array[n] = array[i]; array[i] = temp; } } else { // 出力 console.log( "結果:" + array); } } // エントリーポイント permutation(0); </script> 処理を理解するために、コメントの(1)や(3)などに console.log を入れて、出力したところ、全く理解できないスタックの流れになっていました。 具体的には、1~2を条件を満たす間繰り返した後、一度出力(スタック開放)します。その後、(3)の処理をするのですが、その直ぐ後に、また(3)の処理をするのです。 具体的なログは以下のようになりました。 【n=0】**************************// 関数の呼出しと呼出し時の引数です。 i=0  再帰前:1回:0,1,2,3 n=0      // (1)の処理です。0,1,2,3は、対象の配列です。 【n=1】************************** i=1  再帰前:2回:0,1,2,3 n=1 【n=2】************************** i=2  再帰前:3回:0,1,2,3 n=2 【n=3】************************** i=3  再帰前:4回:0,1,2,3 n=3 【n=4】************************** スタック開放:0,1,2,3 n=4   再帰後:1回:0,1,2,3 n=3     // (3)の処理です。   再帰後:2回:0,1,2,3 n=2     // なぜ連続して呼ばれているのか i=3  再帰前:5回:0,1,3,2 n=2 【n=3】************************** i=3  再帰前:6回:0,1,3,2 n=3 【n=4】************************** スタック開放:0,1,3,2 n=4   再帰後:3回:0,1,3,2 n=3   再帰後:4回:0,1,2,3 n=2     // なぜ連続して呼ばれているのか   再帰後:5回:0,1,2,3 n=1     // なぜ連続して呼ばれているのか i=2  再帰前:7回:0,2,1,3 n=1 【n=2】************************** “なぜ連続して呼ばれているのか”の部分が理解できません。予想では、再帰後の部分が一度呼ばれて、このプログラムは止まってしまうと思うですが、最後まで動きます。 なぜ、止まらずに動くのか教えてください。

  • 確率(順列・組み合わせ)

    順列、組み合わせの理解があやふやで困っています。 例えば、 (1) 見た目が全く同じさいころを2つ振って、出目の和が11になる(つまり出目が5,6になる)確率 (2) 大きさの異なるさいころを2つ振って、出目の和が11になる確率 (3) 1~6までの数字が書かれたカードの入った袋を2つ用意し、それぞれから1枚ずつカードを抜き出したとき、カードに書かれている数字の和が11になる確率 (4) 1~6までの数字が書かれたカードを2枚ずつ用意し、2枚のカードを抜き出したとき、カードに書かれている数字の和が11になる確率 という4パターンを考えたとき、それぞれ確率はどのようになるのでしょうか。個人的には、 (1)~(3)  :(1,4)と(4,1)は区別して1/18 (4)    :(1,4)と(4,1)の区別は無く1/21 となるのではないかと思います。

  • 上限のある重複組合わせ(?)

    以下の42個の数字から、n個 抜き取った組合わせは何通りかという問題がありまして(自作)。 1, 5, 6, 6, 8, 8,10,13,13,14, 14,15,17,18,18,19,21,21,22,25, 26,27,28,28,30,30,30,30,30,31, 31,34,35,35,36,39,40,40,41,41, 41,42 総当りで出力し、カウントをするプログラムはできまして(n=0個から) 1 26 337 2902 18667 95612 405931 1468386 4616880 12809820 31736232 70875642 143789049 ・・・ という感じで答えはわかっているのですが、時間もかかるし(3sぐらい)実際の組合わせは知る必要はないので もっと数学的に計算でできないのか、考えているんですけど解りません。 問題を簡単にして、↓のように考えたのですが、やっぱり無駄に計算量が多いような気がします。 1,1,1,1,2,2,2,3,3,4 の10個の内 7個 4種類の数字の重複組合わせをベースとし 4 H 7 -> 4+7-1 C 7 -> 10 C 7 -> 120 ・4 は、1つしかないので、2つ以上を含むパターンを除外する 4-4 確定 あと 5つを 4 H 5 -> 56 ・3 は、2つしかないので、3つ以上含むパターンを除外する。 3-3-3 確定 あと4つを 4 H 4 -> 35 ・2 は、 3つしかないので、4つ以上含むパターンを除外する。 2-2-2-2 確定 あと3つを 4 H 3 -> 20 ・1 は、 4つしかないので、5つ以上含むパターンを除外する。 1-1-1-1-1 確定 あと2つを 4 H 2 -> 10 120-56-35-20-10 = -1 ただし、以下は重複しているので加算する。 4-4-3-3-3-*-* 10 4-4-2-2-2-2-* 4 3-3-3-2-2-2-2 1 4-4-1-1-1-1-1 1 -1 +10+4+1+1 -> 15 プログラムはすこしわかるのですが、数学はわかりません。 すぱっと数式ででるやりかたがあれば教えてください。

  • 組み合わせの数を計算する数式を教えて下さい。

    12個数字(1~12)の組み合わせの数を計算する数式を知りたいです。 ルール: 1.最低1個、最大12個数字を選べます 2.重複不可 3.順番関係なし 一応、プログラムで全組み合わせを出力しましたが、正しいかどうかは不明です。 一応組み合わせの数は4095らしいです。 出力例: "1" "1, 2" "1, 2, 3" "1, 2, 3, 4" "1, 2, 3, 4, 5" "1, 2, 3, 4, 5, 6" "1, 2, 3, 4, 5, 6, 7" "1, 2, 3, 4, 5, 6, 7, 8" "1, 2, 3, 4, 5, 6, 7, 8, 9" "1, 2, 3, 4, 5, 6, 7, 8, 9, 10" "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11" "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12" "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12" "1, 2, 3, 4, 5, 6, 7, 8, 9, 11" "1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12" "1, 2, 3, 4, 5, 6, 7, 8, 9, 12" "1, 2, 3, 4, 5, 6, 7, 8, 10" "1, 2, 3, 4, 5, 6, 7, 8, 10, 11" "1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12" "1, 2, 3, 4, 5, 6, 7, 8, 10, 12" "1, 2, 3, 4, 5, 6, 7, 8, 11" "1, 2, 3, 4, 5, 6, 7, 8, 11, 12" "1, 2, 3, 4, 5, 6, 7, 8, 12" "1, 2, 3, 4, 5, 6, 7, 9" "1, 2, 3, 4, 5, 6, 7, 9, 10" "1, 2, 3, 4, 5, 6, 7, 9, 10, 11" … … … "8, 12" "9" "9, 10" "9, 10, 11" "9, 10, 11, 12" "9, 10, 12" "9, 11" "9, 11, 12" "9, 12" "10" "10, 11" "10, 11, 12" "10, 12" "11" "11, 12" "12"

  • 順列文字の生成処理

    次のような左端の番号に対応した右側の文字列を作りたいのです。 これらの4個の文字列は、重複無しの順列になります。 下表では文字列が4個ですが、実際には7個程度まで生成したいのです。7個の場合は合計1*2*3*4*5*6*7=5040個になります。 言語はFORTRANですがCでも、あるいは手順説明でも良いです。文字列でなくともn桁数字あるいは配列でも良いです。c++のクラス処理も候補かも知れませんが、FORTRANで書くには荷が重いです。再帰処理は何とかなるかも知れませんが、できれば無しを希望します。 4個程度ならデータとして書けば済みますが、6,7個となるとそうは行きませんので、プログラムで生成したいのです。処理時間は問題になりません。 N個の処理を使ってn+1個の処理の形式で大分頭を悩ませましたが、ギブアップ気味です(まだ1日程度ですが)。虫の良いお願いですが奇特な諸兄のお知恵を拝借したく存じます。 1: 1234 2: 2134 3: 1324 4: 3124 5: 2314 6: 3214 7: 1243 8: 2143 9: 1423 10: 4123 11: 2413 12: 4213 13: 1342 . . 18: 4312 19: 2341 . . 24: 4321

  • 碁石、順列

    こんばんわ。 つい最近 別件で質問させていただいたばかりですが、 またプログラミングに関して 解決できないことがありまして ここに来ました(汗) タイトルの通りの問題なのですが、 何個かある碁石の中から いくつか取り出して、それを並べる には 何通りの順列がありうるかを算出するプログラムを 作りたいのですが、 たとえば 白が2個、黒が2個あったとして そこからランダムに3個とった場合について説明 させていただきます。 今書いているプログラムは、 ランダムに取り出してきた3個を choice[]という配列に格納します。 そして、順列ですから 重複してはいけないということで 今まで生成した順列にかぶるものがないか 確認できなければ いけないので、重複のないように、今までに選んだ3個の並びを stock[][]という二次元配列に格納していくようにしました。 ここが問題になっています。ここでバグがおきていて(私の 無知により間違った記述をしているためと思われますが、) for(i=0;i<5;i++){ for(j=0;j<3;j++){ stock[i][j] = choice[j]; } } printf("stock:%s\n",stock[0]); *stock[i][j]は、あらかじめ'E'で初期化をしております。 上記のように書きました。 これは、選択した3つが入ったchoice[j]を、stockの中に 同じものがないかを確認して、なければ代入する という感じで 書いたものです。 で、printf文は、stock[0]つまり stock[0][0]~stock[0][2] を表示させて、choiceと同じ3つが入っているか確認したかった ためなのですが、 choiceがWBB(白、黒、黒の意味)のとき stock:WBBEEEEEEEEEEEE と表示されてしまいます。 私は、stock:WBB となることを期待していたのですが。。。 で、たとえば次に選択した3つがBWBだとしたら 前にストックしたWBBとは違うから またstock[][]に代入する ことにして、 stock[1]が、BWB となるようにしたいのです。 そうやって貯めていければ、たとえば 上記のように 2回目に選択したとき、 choiceが stock[][]の中にあるものと、一致したら 重複順列だからカウントしない というようなことができるのですが、 そもそもstockへの入り方が期待したものと違い よくわからないことになっているものですから、 すべて、”一致していない”のほうを通ってしまい、 正常に実行できないでおります。 いったい、何を勘違いしており、どのようにすれば 解決できるのでしょうか(>_<) どなたかアドバイスいただけますでしょうか。 お手数ですが、よろしくお願いいたしますm(_ _)m

  • 50種類から3品目を3日間別パターンで特売

    組合せの問題がわかりません。 「50種の商品から 3品目を毎日別パターンで 3日間特売を行う場合は 16億を超える組み合わせとなる」 とあったのですが、組合せが16億になるのがわかりません。 チョコは毎日使ってもいいと解釈しました。 2品目までの重複も別物の組み合わせと考えてよいと解釈しました。 1日目 チョコ、バナナ、リンゴ 2日目 チョコ、イチゴ、バナナ 3日目 チョコ、リンゴ、桃 50C3 50!/ 47!3! × 3 = 58,800 16億になりません。 以下、やってみましたが、これもあてはまりません。 50C6 50!/ 44!6! = 699,190,800  ←3日間商品重複なしの場合 50P3 50!/ (50-3)!×3 = 352,800  ←とにかく順列で処理 計算方法がわかりません。