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