あるごりずむ

希望の個体値の野生ポケモンが色違いになるID,SIDの組を実現する
初期Seedを逆算するアルゴリズムを考えてみた。
プログラミング力0の私には実現不可能だけど。
だれかGUIで作ってw


希望の個体値性格,初期Seedの下4桁上限値(lim)を入力

性格値を逆算(複数の場合出力をどちらにするか選択)

性格値上位 xor 性格値下位 を計算(この値をAとする)

a(i)= A xor i (i=0〜7)
を計算

SID(ID,i) = ID xor a(i) (ID=0〜65535,i=0〜7)
を計算

Seed(ID,i) = (SID(ID,i)*0x10000+ID) and 0xFFFFFFFF

Seed(ID,i)から孵化乱数の逆算を2個分行い、FSeed(ID,i)とする

FSeed(ID,i)を0xXXYYZZZZで表した時のYY,ZZZZに着目し、
YYが0〜23かつZZZZがlim未満のものをIDおよびSIDとともに出力


似非 C 言語的に書くと

int main(void){
unsigned int sta[8],PID,i,A,a[10],ID,SID[10],Seed[10],FSeed[10]; //変数を宣言


list();
printf("個体値性格を入力してください(H A B C D S Nature) \n");
scantf("%d%d%d%d%d%d%d",&sta[0],&sta[1],&sta[2],&sta[3],&sta[4],&sta[5],&sta[6]);//個体値性格を入力
printf("初期Seedの下4桁上限値を16進数で入力してください \n");
printf("0x");
scantf("%x",&lim);//個体値性格を入力


PID=gyaku1(sta[0],sta[1],sta[2],sta[3],sta[4],sta[5],sta[6]);//個体値性格から性格値を逆算


A=(PID>>16) ^ (PID%0x10000) //性格値からA=(性格値上位 xor 性格値下位)を計算


for(i=0;i<8;i++){ //iのループ
 a[i] = A ^ i;
 for(int ID=0;ID<65536;ID++){ //IDのループ
  SID[i] = (ID ^ a[i])&&0xFFFF; //IDからSIDを逆算
  Seed[i] = (SID * 0x1000+ID)&&0xFFFFFFFF;
  FSeed[i] = gyaku2(Seed[i]);//Seed[i]から初期Seed(FSeed[i])を逆算
  if((FSeed[i] % 0x10000 < lim) && ((FSeed[i] >>16) % 0x100<24){
   printf("ID=%05d SID=%05d FSeed=%08x\n",ID,SID[i],FSeed[i]);
   }//ifおわり
  } //IDのループおわり
} //iのループおわり
} //main関数のおわり


int list(void){ //性格リスト表示
printf("*********************************************************************\n
Nature List\n\n
0 がんばりや 1 さびしがり 2 ゆうかん  3 いじっぱり 4 やんちゃ\n
5 ずぶとい  6 すなお   7 のんき   8 わんぱく  9 のうてんき\n
10 おくびょう 11 せっかち  12 まじめ   13 ようき   14 むじゃき\n
15 ひかえめ  16 おっとり  17 れいせい  18 てれや   19 うっかりや\n
20 おだやか  21 おとなしい 22 なまいき  23 しんちょう 24 きまぐれ\n");
printf("*********************************************************************\n");
}


unsigned int gyaku1(int h,int a,int b,int c,int d,int s,int nature){
//HABCDS性格から初期Seedを逆算
//やり方考え中
}

unsigned int gyaku2(int seed){
//現在孵化乱数Seedから2個前の初期Seedを逆算
//やり方考え中
}


プログラミング初心者が作るイメージとしてはこんな感じ。
ここまでかいたけど、実現可能な初期Seedから、出てくるID,SIDを計算させた方早いかな。