void Printegg(unsigned seedx,unsigned parent[2][7],unsigned method,unsigned status[]){ unsigned seed[11],heresta[3],herepar[2],seedx2; unsigned i,j,k,l,m; seed[0]=seedx; seedx2=seedx; for(i=0;i<11;i++){//判定用乱数列作成 seed[i+1]=(seed[i]*0x41C64E6D+0x6073)&0xFFFFFFFF; seed[i]=seed[i]>>16; } for(j=0;j<2;j++){seedx2=(0xEEB9EB65*seedx2+0xA3561A1)&0xFFFFFFFF;}//Printstatu用に初期seedを2つさかのぼる Printstatus(seedx2,status,method);//基礎個体値 if(method==1){k=0;} else{k=1;} heresta[0]=seed[3+k]%6;//遺伝ステ1 heresta[1]=seed[4+k]%5+1;//遺伝ステ2 heresta[2]=seed[5+k]%4+2;//遺伝ステ3 if(heresta[2]==2){heresta[2]=1;} for(l=0;l<3;l++){herepar[l]=seed[6+k+l]%2;}//遺伝親決定 for(m=0;m<3;m++){status[heresta[m]]=parent[herepar[m]][heresta[m]];}//基礎個体値に遺伝を上書き }
void Printstatus(unsigned seedx,unsigned status[],unsigned method){ unsigned seed[4];//0,1:PID 2,3:IVs unsigned chara0,chara1,iv1,iv2; unsigned a,b,c,d,i; seed[0]=seedx; for(i=0;i<5;i++){seed[i+1]=(seed[i]*0x41C64E6D+0x6073)&0xFFFFFFFF;}//seed列作成 switch(method){ case 1://そのまま使用 [PID] [PID] [IVs] [IVs] [xxx] break; case 2://2を消して詰める [PID] [PID] [xxx] [IVs] [IVs]→[PID] [PID] [IVs] [IVs] [xxx] seed[2]=seed[3]; seed[3]=seed[4]; break; case 3://1を消して詰める [PID] [xxx] [PID] [IVs] [IVs]→[PID] [PID] [IVs] [IVs] [xxx] seed[1]=seed[2]; seed[2]=seed[3]; seed[3]=seed[4]; break; case 4://3を消して詰める [PID] [PID] [IVs] [xxx] [IVs]→[PID] [PID] [IVs] [IVs] [xxx] seed[3]=seed[4]; break; default: break; } chara0=seed[0]>>16; chara1=seed[1]>>16; chara1=chara1<<16; status[6]=chara0+chara1; iv1=seed[2]>>16; status[0]=iv1%32; a=iv1>>5; status[1]=a%32; b=iv1>>10; status[2]=b%32; iv2=seed[3]>>16; status[3]=iv2%32; c=iv2>>5; status[4]=c%32; d=iv2>>10; status[5]=d%32; }
http://d.hatena.ne.jp/ayuzak/20090110
HABとCDSの生成seedが連続の場合はmethod=1、1つ空く場合はmethod=4。