某所で話題のホイミテーブルの乱数生成器を見つけたのでこっそり投下
>>128と同様な乱数で、こちらはデータ領域(乱数シードなど)が02108d20にある
ホイミの回復量から乱数シードを検索して、その後の回復量(確率)を計算するプログラム
回復量を5,6個入れれば特定できるはず
タイマーで乱数シードを初期化しているので、電源オン時はここで探索している範囲に入るはず
使い方はこんな感じ
$ ./a.out 32 30 31 31 37 37
#include <stdio.h>
unsigned long long rand_seed; //0x02108d20
unsigned long rand(void)
{
rand_seed = rand_seed * 0x5d588b656c078965ULL + 0x269ec3ULL;
return (rand_seed >> 32) & 0xffffffff;
}
int main(int argc, char *argv[])
{
unsigned int i;
unsigned long long i_max=0x100000000ULL,first_seed;
double d;
int hoimi[6];
if(argc < 3) return 0;
argc--;
for(i=0;i<argc;i++)
{
hoimi[i] = strtol(argv[i+1],NULL,10)-30;
}
for(first_seed=0x10000;first_seed<0x50000;first_seed++)
{
rand_seed = first_seed;
for(i=0;i<argc;i++)
{
d = rand();
d /= i_max;
if((d<(double)hoimi[i]/10-0.05) || (d>(double)hoimi[i]/10+0.05)) break;
}
if(i!=argc)
{
continue;
}
printf("%016llx",first_seed);
rand_seed = first_seed;
for(i=0;i<100;i++)
{
d = rand();
d /= i_max;
if(!(i%10)) printf("\n");
printf("%.0f(%.1f%%) ",30+d*10,d*100);
}
printf("\n");
}
return 0;
}