http://dixq.net/forum/viewtopic.php?f=3&t=14127
この質問に感化され、48人が一斉にジャンケンすると何回目で勝負が決まるかシュミレーションするプログラムを書いてみた
コードはこちら
► スポイラーを表示
CODE:
#include "stdafx.h"
#include
#include
#include
int compatible(int x,int y){
return (x-y+3) % 3;
}
typedef struct{
int num;
bool flag;
int hand;
}player;
const int tyoki = 0;
const int par = 1;
const int goo = 2;
unsigned long counter;
//武器の三すくみの決定
//戻り値(3すくみで実施する場合)
//0...引き分け
//1...後者の勝ち
//2...前者の勝ち
int _tmain(int argc, _TCHAR* argv[])
{
//何人残ってるかのカウンタ
int count = 0;
time_t timer;
//あいこを調べるbool値
bool bAiko[3];
//プレイヤ構造体
player p[25];
int num = sizeof(p)/sizeof(p[0]);
//初期設定
for(int i = 0;i 3){
if(bAiko[0] == true&&bAiko[1] == true&&bAiko[2] == true){
printf("あいこでしょ\n");
continue;//最初に戻る
}
}
//総当たり
for(int i = 0;i < num - 1;++i){
for(int n = i+1;n < num;++n){
int nRet;
if(p[i].flag == false || p[n].flag == false){
continue;
}
nRet = compatible(p[i].hand,p[n].hand);
switch(nRet){
case 0://引き分けなので生存フラグを折らない
break;
case 1://前者の生存フラグを折る
p[i].flag = false;
break;
case 2://後者の生存フラグを折る
p[n].flag = false;
break;
}
}
}
//生存人数を調べる
for(int i = 0;i < num;++i){
if(p[i].flag == true){
count++;
}
}
printf("生存人数 %d\n",count);
//1人ならばブレーク
if(count == 1){
//勝者の出力
for(int i = 0;i < num;++i){
if(p[i].flag == true){
printf("勝者は%dさんです\n",i);
printf("勝負回数 %d\n",counter);
}
}
break;
}else{
count = 0;
}
}
//初期設定
for(int i = 0;i < num;++i){
p[i].flag = true;//生存フラグ
p[i].num = i;
}
}
printf("%d人だと平均%d回\n",num,counter / number);
return 0;
}
まず10回試行して、10人だと平均何回で勝負が決まるか計算する
/*勝者は6さんです
勝負回数 146
10人だと1回平均14回
*/
現実的にもあり得そうな人数。
このくらいの人数ならば誰しもやったことが有りそうな気がする。
次は25人
//n = 10
/*
生存人数 1
勝者は15さんです
勝負回数 85559
25人だと1回平均8555回
*/
一気にハードルが上がりなんと8559回。やってらんない日が暮れる。
次は48人
・・・・・
・・・・・・・・
・・・・・・・・・・演算が全然終わらない。。。
仕方ないので試行回数を1に設定して再演算。
・・・・・30分後
//48人 試行回数1
/*生存人数 1
勝者は40さんです
勝負回数 37832348回
*/
なんと三千七百万回ジャンケンしないと勝者が決まらない。
ヤスシ!次のセンターは背番号40の娘でよろしく!!