天鳳の安定段計算ツール シンプル版 鳳凰用 特上用 上卓・三人打ち用はこちらから
背景指定  

天鳳の洗牌と牌山積みと配牌

ここで記載している内容は2009年7月22日以前の方法です
※現在は乱数発生方法がMersenne Twisterに変わっていますが、ここでの説明のメインである並び替え方法、つまり項目2.以降は基本的に以前と同じはずです。

新しい乱数発生方法はつのブログ(牌山生成の公開方法)へ
牌操作疑惑テンプレで、一連の流れが大雑把に分かる。
天鳳公式ページの「ゲームへの疑惑・牌操作」項目も。


課金者優遇やら牌操作という話が掲示板などで飛び交う天鳳であるが、実際にはどうなっているのであろうか?

答えを先に言うと、一番最初に牌をかき混ぜて並べている。
ツモる度に残りの牌からランダムに選んでいるわけではない。

さて、天鳳の運営者である「つの」はmixiの天鳳コミュニティーでこう書いている。

山の生成ですが、次のコード以上の仕組みはありません。

unsigned long randseed[8]; // <INIT />のshuffleから生成
init_by_array(randseed,8);
for(i=0;i<136;++i) yama[i]=i;
for(i=0;i<136-1;++i) swap(yama[i],yama[i + (genrand_int32()%(136-i))]); // サンマは108
※yama[0,1,2,3]が親の最初の配牌4枚、yama[134]が1つ目の嶺上牌


09/02/24追記:

mixiの天鳳、不具合報告トピックに以下の様な事が書かれていた。

712 2009年02月08日 23:42

質問が具体的でなくて申し訳ありません。
yama[0,1,2,3]が親の配牌と書かれていますが、yama[135,134,133,132]が親の配牌になっているように思えたので確認をお願いしたいと思った次第です。

713 2009年02月09日 03:24

つの
あれ、そうなっていました。
山は後ろから消費しています。

天鳳運営に確認したところ、次の事が判明したので適正に修正。

1.1つ目の嶺上牌はyama[0]、嶺上牌はyama[0]~yama[3]
2.ドラ表示牌は4麻=yama[4]、3麻=yama[8]。

基本的に従来と左右逆になった。
本質的な事は変わらず。

09/02/24追記ここまで

ということで、これを元に推測してみる。

1.まず最初に乱数用の処理

これによって乱数発生時の偏りを無くする。
つまり周期的に同じ配牌やツモになるのを避ける。
※現在の方法では、ここが変わっている。


2.136枚の牌を横一列に並べる

たぶん内部的にはこんな感じ。
一萬一萬一萬一萬二萬二萬二萬二萬三萬三萬三萬三萬・・・發發發發中中中中
そして左端から位置情報を0,1,2,3,4,5・・・133,134,135と振る。
0なら一萬、5なら二萬、133なら中という感じ。
何故1でなく0からなのかは気にしないのが吉


3.洗牌

牌をかき混ぜる代わりに牌をバラバラに入れ替える。

調べたらFisher-Yatesという方法を使っているようだ。
このサイトで、その方法を視覚的に見ることができる。

まず最初に、左端の一萬(位置は0)を入れ替える。この際に0~135までの数字をランダムに選び、その位置の牌と入れ替える。
49ならこう
四筒一萬一萬一萬・・・四筒一萬四筒四筒・・・中中中中

次に左端から二番目の一萬(位置は1)を入れ替える。この際に1~135までの数字をランダムに選び、その位置の牌と入れ替える。
34ならこう
四筒九萬一萬一萬・・・九萬九萬一萬九萬・・・中中中中

次に左端から三番目の一萬(位置は2)を入れ替える。この際に2~135までの数字をランダムに選び、その位置の牌と入れ替える。
135ならこう
四筒九萬中一萬二萬二萬二萬二萬・・・中中中一萬

こうやって135牌目(位置は134)まで入れ替えていく。特徴としては、対象となる牌の左側の牌とは入れ替えない。上記の例で言えば、位置2の一萬は位置0の四筒と位置1の九萬とは入れ替わらない。


4.配牌

全部入れ替えるとこんな感じ。
四筒九萬中七索五筒二索三筒七萬・・・三索三萬南七筒九筒五筒赤五萬六筒
そして、親→子の順に右端から4枚づつ配っていく。


5.牌をツモる

配牌終了後、残った牌の右端から順次ツモる。この部分は想像だが、多分間違いないだろう。
鳴きでツモ順が変われば、リアルと同じようにその後のツモ牌は変わる。


6.王牌部分

左端から14枚が王牌となる。

位置情報が偶数が上山、奇数が下山になるので、上の例を用いれば最初の嶺上牌は四筒、その下の牌が九萬、ドラ表示牌が五筒、裏ドラ表示牌が二索となる。

視覚的にはこんな感じ
裏裏五筒裏裏裏裏

開くとこう
四筒中五筒三筒西八索四萬

このように、リアル麻雀同様に牌の並びは決まっているため、必要牌が喰い流された時は思いっきり悔しがってok
追いかけリーチ相手の当たり牌を一発で持ってくるのもついてないだけ。

つのが書いた通りなら、おかしなことは何も無し