天鳳の洗牌と牌山積みと配牌
課金者優遇やら牌操作という話が某掲示板では飛び交う天鳳であるが、実際にはどうなっているのであろうか?
答えを先に言うと、一番最初に牌をかき混ぜて並べている。
ツモる度に残りの牌からランダムに選んでいるわけではない。
さて、天鳳の開設者であるつのは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の天鳳、不具合報告トピックに以下の様な事が書かれていた。
天鳳運営に確認したところ、次の事が判明したので適正に修正。
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
追いかけリーチ相手の当たり牌を一発で持ってくるのもついてないだけ。
つのが書いた通りなら、おかしなことは何も無し
答えを先に言うと、一番最初に牌をかき混ぜて並べている。
ツモる度に残りの牌からランダムに選んでいるわけではない。
さて、天鳳の開設者であるつのは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
追いかけリーチ相手の当たり牌を一発で持ってくるのもついてないだけ。
つのが書いた通りなら、おかしなことは何も無し
コメント
No title
No title
>なめとんさん
大会の際はお世話になりました。
リベンジの楽しみはそのうちにw
>証明して納得
一局の対戦中に観戦で山表示ができてしまうと、それ自体が大きな不正に繋がってしまうので、こればかりは天鳳のシステムを信用するしか無いでしょうね。
もしくは、信用できなければ天鳳には手を出さないというのが、我々利用者が取れる選択肢です。
大会の際はお世話になりました。
リベンジの楽しみはそのうちにw
>証明して納得
一局の対戦中に観戦で山表示ができてしまうと、それ自体が大きな不正に繋がってしまうので、こればかりは天鳳のシステムを信用するしか無いでしょうね。
もしくは、信用できなければ天鳳には手を出さないというのが、我々利用者が取れる選択肢です。
コメントの投稿
でも実体として積まれてるわけじゃないので、証明して納得させることはむずかしそうですね。
この前の大会ではお世話に?なりましたw
ネトゲチーム決勝行きたかったですね〜。