C言語でロト6の全ての組み合わせ(ちなみに 6096454通り )を出力するプログラムを紹介します。
ロト6とは?
ロト6(LOTO6)は、1~43までの数値の中から異なる6つの数値を選ぶ宝くじです。
1等賞金は、約2億円といわれています。
ちなみに、わたしはやった事がありません。その組み合わせが6096454通りもあるからです。
まず当たらないでしょ!
参考文献
わたしも無い知恵をしぼってプログラムを考えてみたのですが、考えるほど分からなくなり辞めました。
神戸大学の谷﨑久志教授(現在は大阪大学所属のようです)が1994年に発表された資料にC言語で組み合わせを出力するプログラムが紹介されていました。
資料にあった再起処理を使った実行速度の速い方のプログラムをほぼそのまま使わせて頂きます。
ロト6の全ての組み合わせを出力するCプログラム
loto6.c
/* loto6.c */
#include <stdio.h>
void nest0(int nest, int column, int n1, int n2, int m[])
{
int i, k;
for(i=nest+1; i<=n2+column; i++){
m[column] = i;
if(n1 != column)
nest0(i, column+1, n1, n2, m);
else{
for(k=1; k<=n1; k++) printf("%3d", m[k]);
printf("\n");
}
}
}
void comb2(int n1, int n2)
{
int m[101];
int nest, column;
nest = 0;
column = 1;
nest0(nest, column, n1, n2, m);
}
int main(void)
{
/* ロト6の全ての組み合わせを出力する */
comb2(6, 37);
return 0;
}
comb2関数に渡す2つの引数により、組み合わせを求めたい数値を指定します。
void comb2(int n1, int n2);
この場合、引数n1とn2の意味は、
1から n1+n2 までの n1+n2個の数字から、n1個を取り出す組み合わせを出力する
となっています。
すごく簡単な例として1~3までの数字から2個を取り出す場合は、
comb2(2,1);
とすれば以下の結果が得られます。
1 2 1 3 2 3
ロト6の場合1~43の数字から6個取り出すので
comb2(6, 37);
とすれば良いことになります。
コンパイルと実行
gccコンパイラなら
gcc -o loto6 loto6.c
とすれば実行ファイル loto6.exe が作成できます。
実行は、
loto6
とすればOKですが、6096454通り全てを出力するにはちょっと時間が掛かりすぎるので、(わたしは恐くてやっていません!)以下のようにテキストファイルに落とせば10秒も掛かりませんのでおすすめです。
loto6 > loto6.txt
ただし作成された loto6.txt は、100MB以上ありました。ダブルクリックでメモ帳で起動するとメモ帳が応答しなくなります。Visual Studio Codeなどのテキストエディタで開くことをおすすめします。
この実行結果ファイルだけが必要なら以下記事よりダウンロードできます。
コメント