サイコロの出目の分布とパスカルの三角形 -プログラミング編-
前回からの続き。『サイコロの出目の分布とパスカルの三角形』今回は、場合の数というか、確率というか、統計というか、そっち方面の話で、面白い性質を見つけたのでご紹介します。正六面体のサイコロをn個同時に振ったときの各出…ameblo.jpExcelのワークシート関数だけでも出来るだろうし、当然マクロでも出来るだろう。まぁ、自分はC言語が最強だと思っているので、C言語で書く。#include <stdio.h>#include <stdlib.h>#include <math.h>#define MAX1 10#define MAX2 1000int main(int argc, char *argv[]){ unsigned long long m[MAX1][MAX2]; double sum; int f,q; int i,j,k; if ( argc == 3 ) { f = atoi(argv[1]); q = atoi(argv[2]); } if ( argc != 3 || f < 2 || f > 100 || q < 2 || q > 10 ) { printf("Usage: %s face quantity\n",argv[0]); printf("\t1 < face < 101\n"); printf("\t1 < quantity < 11\n"); return EXIT_SUCCESS; } for (i=0; i<MAX1; i++) for (j=0; j<MAX2; j++) m[i][j] = 0; for (i=0; i<MAX1; i++) m[i][0] = 1; for (j=0; j<f; j++) m[0][j] = 1; for (i=1; i<q; i++) { k = (f-1)*i+f; for (j=0; j<k; j++) { m[i][j] = m[i][j-1]+m[i-1][j]-m[i-1][k-j]; } } sum = pow(f,q); for (j=0; j<k; j++) { printf("%4d %18llu %.10e\n",q+j,m[q-1][j],(double)m[q-1][j]/sum); } return EXIT_SUCCESS;}50行にも満たないコードを書いてみる。一応、100面体サイコロを10個まで列挙出来るものにした。コードを書いていて、気がついたのだが、分布の整数比の総和は、サイコロの面数の個数乗ということ。100面体を10個だと100^10=(10^2)^10=10^20=100000000000000000000と、0が20個も続くわけで、unsigned long longには収まらない。このためだけに、多倍長整数型とか作るのもなんなんで、どうせ確率は小数表記なので、sumはdouble型でもいいだろう。なお、出力をファイルにすれば、スペースで揃えたcsv形式そのものなので、Excelにコピペして使ってもいいだろう。暇つぶしにはなったかな。ではではa img { background-color: lightgray;}table.renbun td { border: 0px; padding: 2px 2px 2px 2px; vertical-align: middle; white-space: nowrap; }table.renbun td.ul { border-style: solid; border-width: 0px 0px 1px 0px; }table.renbun td.ol { border-style: solid; border-width: 1px 0px 0px 0px; }table.ans td:nth-child(1) { text-align: center; }table.ans td div { width: 265px; overflow-x: scroll; }table.ans td div span { white-space: nowrap; }table.test td {white-space: nowrap;padding: 0 5px;} .u {border-bottom-style: solid;border-bottom-width: 1px;text-align: center;}table#list td { padding: 0 2px; font-family: monospace; }.no { display:inline-block; text-align:center; vertical-align:middle;}.ni { display:inline-block; text-align:center; vertical-align:middle; line-height:100%;}.ns { font-family:serif; font-size:250%; line-height:100%;}.io { display:inline-block; white-space:nowrap;}.io sub { vertical-align:bottom; white-space:nowrap;}.io sup { vertical-align:top; white-space:nowrap;}.ii { display:inline-block; vertical-align:middle;}.is { vertical-align:middle; font-family:arial;// font-family: sans-serif; font-size:300%; line-height:70%; font-weight: 5;// margin: 0 -15px 0 -10px;}.ii2{ display:inline-block; line-height:100%; vertical-align:middle;}.is2{ line-height:155%;// line-height:109%; font-family:sans-serif;}.mo { display:inline-block; vertical-align:middle;}.mi { display:inline-block; white-space:nowrap; vertical-align:middle; line-height:100%;}html:not([lang]) .mp { display:inline-block; line-height:100%; font-size:120%; font-family:sans-serif; margin: 0; padding: 0;}.mp{ display:inline-block; line-height:100%; font-size:120%; font-family:serif; margin: 0; padding: 0;}.md{ display:inline-block; line-height:120%; text-align:right; margin: 0 5px;}.lo { display:inline-block; text-align:center; vertical-align:middle;}.li { display:inline-block; text-align:center; vertical-align:middle; line-height:100%; margin: 0 5px 0 0;}.ls { font-family:serif; font-size:120%; line-height:100%;}.fb {border-style:solid;border-width:1px 0 0 0;margin:1px 0;}.fo {display:inline-block;text-align:center;vertical-align:middle;white-space: nowrap;}.fo span {margin: 0 3px;}.fo span span {margin: 0 0;}.article table {white-space: nowrap;}.ro{display:inline-block;white-space:nowrap;line-height:100%;position:static;}.rt{font-family: 'Meiryo', 'YuGothic', 'Gothic', sans-serif;}.ri{display:inherit;border-style:solid;border-width:1px 0 0 0;padding:0 1px 0 1px;margin:1px 0 0 0;position:relative; left:-1.5px;}article table {margin-bottom: 0 !important;}article table td {white-space: nowrap;text-align: center;}