• ベストアンサー

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

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

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>B1を起点に(10個の中から、6個取る重複順列を列挙する場合)なら210通りすべての組み合わせを表示 B列~G列に210行表示しました。 Sub 組合せ()   Dim i As Long, v As Variant   Dim n1 As Long, n2 As Long, n3 As Long, n4 As Long, n5 As Long, n6 As Long   v = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")   For n1 = 1 To 10 - 5     For n2 = n1 + 1 To 10 - 4       For n3 = n2 + 1 To 10 - 3         For n4 = n3 + 1 To 10 - 2           For n5 = n4 + 1 To 10 - 1             For n6 = n5 + 1 To 10               i = i + 1               Cells(i, "B").Value = v(n1 - 1)               Cells(i, "C").Value = v(n2 - 1)               Cells(i, "D").Value = v(n3 - 1)               Cells(i, "E").Value = v(n4 - 1)               Cells(i, "F").Value = v(n5 - 1)               Cells(i, "G").Value = v(n6 - 1)             Next n6           Next n5         Next n4       Next n3     Next n2   Next n1 End Sub

goemon_2012
質問者

お礼

ご回答、ありがとうございます。 すごく、参考になりました。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

結果をどう得たいのか、補足してください。 #そのそも「何の」マクロなんでしょうかね?ExcelのVBA? #ロト6とminiロトの予想アプリを探すほうが楽かも

goemon_2012
質問者

お礼

ご指摘、ありがとうございます。 分かりにくい質問ですみませんでした。

goemon_2012
質問者

補足

マクロって色々あるんですか?知りませんでした。ぼくの知りたいのはエクセルのVBAのことです。なにぶん最近、パソコンを始めたばかりで知らないことだらけです。質問の仕方が悪かったみたいで、失礼しました。 お察しの通り、ぼくのしたいことはロト6の予想をする時に組み合わせを自分なりに組んでみたいと思ったのです。なので、ご指摘の予想アプリを探したほうが楽だとは思いますが、自分で作ったもので色々検討しながら組み合わせの予想をしてみたいのです。そのほうが見えない何かを見いだせるのではないかと考えています。 初心者には無理だと言われれば、それまでなのですが自分でどこまでできるのかを試してみたいと思っています。お時間のあればご指導ください。 ぼくの知りたい結果は、例えば、A1セルでマクロをスタートさせたら、B1を起点に(10個の中から、6個取る重複順列を列挙する場合)なら210通りすべての組み合わせを表示させたいと思っています。 よろしくお願いします。

関連するQ&A

  • 順列の列挙の方法

    順列の列挙の方法といっても辞書式順序のやつではありません。別の制約です。 グレイコードというのをご存知でしょうか。例えばビット列のグレイコードは次のようになります。 0:000 1:001 2:011 3:010 4:110 5:111 6:101 7:100 これがどんな制約を満たしているかと言うと、 1、となりのビット列に変換するには1ビット反転すれば良い。 2、すべてのビット列がちょうど1回現れる。 この2つです。グレイコードの正確な定義はさておき、とりあえず今はこれと言うことにします。 この順序でビット列を列挙する関数をC言語で書くと次のような感じになります。 f(int n) { if(n==-1)return; f(n-1); 第nビットを反転; 出力; f(n-1); } さて順列の話ですが、次のような制約を満たす順序で順列を列挙するアルゴリズムは どんな感じになるのでしょうか。 1、となりの順列に変換するには1回スワップ(2つの要素を入れ換える)すれば良い。 2、すべての順列がちょうど1回現れる。 この条件を満たすような順列の列はたくさんあると思いますが、 できるだけ法則性のあるやつ、というかプログラムに書きやすいやつを お願いします。 ビット列のアルゴリズムをちょこっと変えれば出来るかなーと思っていたのですが 数学的センスが無いせいか、苦戦しています。数学的センスのある方、ぜひご教示ねがいます。

  • 同じものを含む順列

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

  • 数1・A 重複順列について質問です!

    数1・A 重複順列について質問です! 重複順列…異なるn個のものの中から重複を許してr個取り出す順列。 と、テキストには書いてあるのですが、問題によって、どれをn、どれをrにするのか考えてしまます。 何か、区別しやすい方法などありますか?? 例えば、 問 5人が1回じゃんけんをするとき、その手の出し方は??? 解 3⁵=243通り すごい基本的なことで申し訳ないのですが、お願いします!!

  • C言語で重複組合せを全列挙

    よろしくお願いします。当方プログラミング初心者です。 ある配列a[]={1,1,2,2,3,3}があります。 この配列の重複組合せを全列挙したいのですが、 どういうプログラムを組めばいいのでしょうか? よろしくお願いします!

  • 順列の問題

    順列の問題で 6個の数字0,1,2,3,4,5の中から、異なる数字を使って3桁の数を作る。 問.小さい方から順に並べると、43番目の数は何か。 という問題があり、わからなかったので解説を読んだところ 3桁の数のうち、百の位の数字が1または2であるものは 2×5P2=2×5・4=40(個) 百の位の数が3である3桁の数を小さい順に並べると 301,302,304,305... よって求める数は304 というふうにありましたが、良く意味が理解できません; どなたか分かる方、どのようにして解けばよいのか教えていただけませんか? ※・は×(かける)の意味です。

  • 順列

    二つ質問があります、よろしくお願いします。 NAGOYAJOの8文字をすべて並べてできる順列の中で、OAまたはAOという並びを少なくとも1つ含む順列はいくつあるか? 余事象を考え、・・・・・・ NGYJの両端と間に、AA、O、OとOO、A、A を入れるとおりで間違えてしまいました・・・・・ なぜ、5C1×4C2になるのでしょうか??・・・(1) また、方針、論理の進め方はあってるのですが、どうしてもこのような問題だと、数え違え(重複してor数えたり無い)をしてしまいます・・・・・・ 場合の数の数え方で完璧に間違えなくするにはどうしたらよいでしょうか?(問題集など)・・・(2)

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

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

  • 碁石、順列

    こんばんわ。 つい最近 別件で質問させていただいたばかりですが、 またプログラミングに関して 解決できないことがありまして ここに来ました(汗) タイトルの通りの問題なのですが、 何個かある碁石の中から いくつか取り出して、それを並べる には 何通りの順列がありうるかを算出するプログラムを 作りたいのですが、 たとえば 白が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

  • 重複順列の結果を全て表示できるソフトをご存知ないでしょうか?

    お世話になっております。 4桁、5桁、6桁の数字のそれぞれの重複順列(使用する数字は0~9の10個)の結果を全て表示する必要に迫られ、エクセルのマクロや、ビジュアルベーシックなどに関して全く無知なので方法が解らず困っています。 ためしにフリーソフトで検索してみましたが、順列の総数を 求めることはできても、結果を表示するソフト (例えば4桁であれば10000通り全て表示できるようなソフト) は探せませんでした。 私の探し方が足りないのかもしれません。 どなたか左様なソフト、またはその方法をご存知でしたら教えていただけないでしょうか。 尚、このサイト内で検索したところ、下記のページ http://oshiete1.goo.ne.jp/kotaeru.php3?q=96618 がほぼ求めている回答ではないかと自分なりに考えたのですが、それではこのプログラムをどうしたらいいのかがわかりません(それくらい初心者です) ちなみにパソコンのOSはWINDOWS98、使用できるソフトは EXCEL2000です。 無茶を言っているのは重々承知なのですが、どうぞよろしくお願いいたします。

  • 順列の問題で

    順列の問題で、どうしてこの式が駄目なのか分からない問いがあります。 [問題]A,A,A,B,B,C,Dの7文字のアルファベットを1列に並べるとき、次の場合は何通りあるか。 [問1]Aは隣り合わず、Bも隣り合わない並べ方 [答え]Aが隣り合わない・・・4C2×5C3=120通り Aが隣り合わずBが隣り合う・・・[BB][C][D][A][A][A] 3!×4C3=24 120-24=96通り [自分]Aは置いておいて、B・B・C・Dをまず並べる。 CBDB、BCBD、BCDBの3通りがある。 CBDBでは、□C□B□D□B□の5箇所があるので、Aを埋め込む形で行くと、5C3=10通り、さらに、CとDの並び方を考えると、2通りあるので、10×2=20通り よって、20×3=60通り≠96通り

専門家に質問してみよう