忍者ブログ
大学公認麻雀サークル「競技麻雀部」のブログです。 学生No.1を目指し日々研鑽中。(鳳凰民8人在籍) お問い合わせは、uecmahjong☆yahoo.co.jpまで(アドレスは☆を@でお願いします。)
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
フリーエリア
最新コメント
最新トラックバック
プロフィール
HN:
のの
性別:
男性
自己紹介:
部員募集中!
基本的に火木の週2で活動してます。
週1からの参加もおkです^^

麻雀を始めたいひとも大歓迎♪
メールかコメントくだされば返答いたします。

自分はスペックの関係上よく天鳳打ってますー
バーコード
ブログ内検索
P R
カウンター
忍者アナライズ
[130]  [129]  [128]  [127]  [126]  [125]  [124]  [123]  [122]  [121]  [120

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ある意味麻雀関係ない話

どうも、お久しぶりです、疲労氏です。
今回はいつもと方向性の違う内容です。(ってかこんな話需要あるのかな…)

C言語で配牌を取り分けるプログラムを作ってみました。
細かいアルゴリズムやソースコードなどのわかりにくいところは「続きを読む」に置いておくとして、動作の説明をしようと思います。
配牌を10万回とった結果。配牌に暗刻が10974回出来ました。配牌に暗刻が一つ含まれている確率はだいたい10.7%らしいのでそれなりに正しい結果になってそう。このプログラムだと試行回数を増やすとだいたい10.9%に収束するようです。

現状はこのくらいのことしかできていないので、大した内容もかけず。
特にオチもなく。疲労氏でした。






アルゴリズム
牌を横一列に規則正しく並べる。
牌の枚数分の籤を作り、一枚引く。
左から数えて籤に書かれた数目の牌をツモる。
残った牌を規則正しく並べ直す。
を14回繰り返す。

画像貼ろうと思って写真撮ったのに容量オーバーで載せられなかったよ…


ソースコード(コメントつき)
#include<stdio.h>
#include<stdlib.h>

#define alltile 136
#define allthree 100
//三麻と四麻の牌の枚数。三麻って牌100枚なんだ…
#define tehaimaisuu 14
//後々のために。手牌の枚数

int tumo(int yama[],int N)
{//山から牌を持ってくる関数
int ran,i;

ran=rand();
ran=ran%N;
//”籤”を作って引く

int te;
te=yama[ran];
//”籤”に書かれた番号枚目の牌を手牌に持ってくる。
int newyama[N];
for(i=0;i<ran;i++){newyama[i]=yama[i];}
for(i=ran+1;i<N;i++){newyama[i-1]=yama[i];}
N--;
for(i=0;i<N;i++){yama[i]=newyama[i];}
//さっき引いてきた牌の分の空欄を埋めるために山を詰める。

return te;

}

int check(int tehai[])
{
//手牌に何個対子、暗刻、槓材があるか調べる。これのおかげで天和七対子、天和四暗刻だけは和了系の判断ができてる
//後々のことを考えると手牌(tehai)全部に関してやるよりも特定の牌に対してやった方がいい気がする。
int i,j,k=0,l=0;
for(i=0;i<14;i++){
for(j=0;j<14;j++){k+=(tehai[i]==tehai[j]);}
if(k==3)l=1;k=0;}
if(l==1)return 1;
return 0;

}

int init_yama(int yama[],int N)
{
int i;
N=alltile;
for(i=0;i<N;i++){yama[i]=i/4+1;}
return N;
//Nだけを返せばyamaは変数渡し。
}

int is_tile(int tehai[],int i)
{
//指定した牌の探索。指定した牌の手牌にある枚数を返す。なければ当然0
int j;
int k=0;
for(j=0;j<14;j++)if(i==tehai[j])k++;
return k;

}

main()
{
int i,j,k=0,t;
int s;

int tehai[tehaimaisuu];

int N=alltile;
int yama[N];

for(s=0;s<100000;s++){//繰り返し回数。チェック用ならたくさん繰り返さなきゃ無意味。
N=init_yama(yama,N);
for(i=0;i<14;i++){tehai[i]=tumo(yama,N);N--;}
//配牌(14回ツモ)
k+=check(tehai);

/*
for(i=1;i<10;i++){t=is_tile(tehai,i);for(j=0;j<t;j++)printf("%d",i);}
printf("m");
for(i=10;i<19;i++){t=is_tile(tehai,i);for(j=0;j<t;j++)printf("%d",i-9);}
printf("p");
for(i=19;i<28;i++){t=is_tile(tehai,i);for(j=0;j<t;j++)printf("%d",i-18);}
printf("s ");
for(i=28;i<35;i++){t=is_tile(tehai,i);
                   if(i==28)for(j=0;j<t;j++){printf("t");}
                   if(i==29)for(j=0;j<t;j++){printf("n");}
                   if(i==30)for(j=0;j<t;j++){printf("s");}
                   if(i==31)for(j=0;j<t;j++){printf("p");}
                   if(i==32)for(j=0;j<t;j++){printf("w");}
                   if(i==33)for(j=0;j<t;j++){printf("r");}
                   if(i==34)for(j=0;j<t;j++){printf("h");}}
printf("\n");*/
//コメントアウト部分は配牌の出力。繰り返し回数が大きくなると目障りだからチェック結果のみ出力の方がいい。
}
printf("%d\n",k);
}

突っ込まれどころ
なんでC?
他の言語を使ったことがないから。オブジェクト指向の方が楽って言う話は聞くけど覚えるのが面倒だった。
その配牌本当に信頼できるの?
多分。配牌を10万回とった時の暗刻の割合がかなり統計に近かったから信頼してもよさそう。
現状出来ることは?
配牌を取り分けて簡単なチェックをすることだけ。向聴数はおろか和了かどうかの判断すらまだできていない。対子、暗刻、槓材が何個あるかどうかのチェックだけはできているが、順子の判断がまだできていない。
宇宙麻雀の実装は?
多分やる。俺が遊ぶために。

PR

anastrozole generic price
xln arimidex anastrozole weight gain <a href=http://togkcgwyhpv.com>buy generic arimidex anastrozole</a>, what does anastrozole do for men
お名前
タイトル
文字色
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
非公開コメント

忍者ブログ [PR]

graphics by アンの小箱 * designed by Anne