http://blog.tenhou.net/article/30503297.html より転載 2009年07月13日 牌山生成の公開方法 牌山の生成方法を完全公開にする予定です。 公開する情報は「配山の生成手法」と「乱数シード」になります。 これによって 1.作為的に配牌を選択していない 2.特定の局面で山を操作していない ことが牌譜と対戦ログから検証可能になります。 ※現状でも2.は検証可能です。 以下試験的に作成したサンプルコードです。 (MTやSHAについては省略) MT : http://www.google.co.jp/search?q=mt19937ar.c SHA : http://www.google.co.jp/search?q=sha512.c サンプルコードについてのご意見・アドバイスなどなどは support@c-egg.comまでお願いします。 公開開始スケジュールは準備が整い次第告知していきます。 ■サンプルコード void SampleYamaShuffle(){ static const char *haiDisp[34]={ "一","二","三","四","五","六","七","八","九", "①","②","③","④","⑤","⑥","⑦","⑧","⑨", "1","2","3","4","5","6","7","8","9", "東","南","西","北","白","發","中" }; WORD wShuffleVersionMajor=1; int i; _MTRAND mtRoot; TCHAR szSeedSeqName[32]; { DWORD seed[MTRAND_N]; // これは公開されない if (1){ // 実際のサーバ動作(予定) HCRYPTPROV hCP; // for Win32Only if (!CryptAcquireContext(&hCP,NULL,NULL,PROV_RSA_FULL,0)) throw 0; if (!CryptGenRandom(hCP,sizeof(seed),(BYTE*)seed)) throw 0; if (!CryptReleaseContext(hCP,0)) throw 0; SYSTEMTIME st; // 日付以外を使用する可能性アリ GetLocalTime(&st); wsprintf(szSeedSeqName,_T("%d.%04d.%02d%02d.%02d%02d"), wShuffleVersionMajor, st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute); printf("seedDailyPublic=%s",szSeedSeqName); if (1) for(i=0;i