Random C++

คืออยากได้โค้ตที่แปลงจากโค้ตที่ให้มาเป็น
x/y = 0.10569105691057
อยากทราบว่า X มีค่าเป็นเท่าไหร่ Y มีค่าเป็นเท่าไหร่ เมื่อหารกันแล้วได้ 0.10569105691057
(ขอโค้ตนะคะ)
โดยการใช้การสุ่มค่า คะ
[code]#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define PopSize 9
#define PopLen 2
#define cr 0.8
#define mu 0.1
#define re 0.1
#define TSize 3
#define MaxGen 100

int Pop[PopSize][PopLen],NewPop[PopSize][PopLen];
int Fit[PopSize][2];
int SumFit;

int myrand(int l, int h){
 int y;
 y = h-l+1;
 return(rand()%y + l);
}

void InitPop(){ //Create New Population
 int i,j;
 for(i=0;i<PopSize;i++){
 for(j=0;j<PopLen;j++){
 Pop[j]=myrand(1,9);
 }
 }
}

void ShowPop(){
 int i,j;
 for(i=0;i<PopSize;i++){
 for(j=0;j<PopLen;j++){
 printf("%d ",Pop[Fit[0]][j]); // i = > Fit[0]
 }
 printf("\tFit=%d\n",Fit[1]);
 }
}

void ShowNewPop(){
 int i,j;
 for(i=0;i<PopSize;i++){
 for(j=0;j<PopLen;j++){
 printf("%d ",NewPop[j]);
 }
 printf("\n");
 }
}

void FitEval(){
 
 int i,j,c;
 int r,z=0;
 int f[81]={1,2,3,4,5,4,3,2,1,
 2,3,4,5,6,5,4,3,2,
 3,4,5,6,7,6,5,4,3,
 4,5,6,7,8,7,6,5,4,
 5,6,7,8,9,8,7,6,5,
 4,5,6,7,8,7,6,5,4,
 3,4,5,6,7,6,5,4,3,
 2,3,4,5,6,5,4,3,2,
 1,2,3,4,5,4,3,2,1};
 
 for(i=0;i<PopSize;i++){
 r=0;
 if(Pop[0]==1) {
 z=(Pop[0]+Pop[1])-2; 
 }else{
 z=((((Pop[0]-1)*9)+Pop[1])-1);
 }
 r=f[z];
 Fit[0]=i;
 Fit[1]=r;
 }
 
 for(i=0;i<PopSize-1;i++){
 for(j=i;j<PopSize;j++){
 if(Fit[j][1]>Fit[1]){
 c=Fit[0];
 Fit[0]=Fit[j][0];
 Fit[j][0]=c;
 
 c=Fit[1];
 Fit[1]=Fit[j][1];
 Fit[j][1]=c;
 }
 }
 }
 SumFit=0;
 for(i=0;i<PopSize;i++){
 SumFit+=Fit[1];
 }
}

int TSelect(){
 int solution,t,i;
 solution=myrand(0,PopSize-1);
 for(i=1;i<TSize;i++){
 t=myrand(0,PopSize-1);
 if(Fit[t][1] > Fit[solution][1]){
 solution=t;
 }
 }
 return(solution);
 
}

void Reproduction(){
 int c,i,j;
 if(PopSize==9){
 c=1;
 }else{
 c=PopSize*re;
 }
 
 for(i=0;i<c;i++){
 for(j=0;j<PopLen;j++){
 NewPop[j]=Pop[Fit[0]][j];
 }
 }
}

void Crossover(){
 int c,i,j,p1,p2,cp;
 c=PopSize*(re+cr);
 if(PopSize==9){
 c=7;
 }else{
 c=PopSize*(re+cr);
 }
 for(i=PopSize*re;i<c;i++){
 p1=TSelect();
 do{
 p2=TSelect();
 }while(p1==p2);
     cp=1;
 for(j=0;j<PopLen;j++){
 if(j<cp){
 NewPop[j]=Pop[p1][j];
 NewPop[i+1][j]=Pop[p2][j];
 
 } else{
 NewPop[j]=Pop[p2][j];
 NewPop[i+1][j]=Pop[p1][j];
 }
 }
 
 i++;
 } 
}

void Mutation(){
 int i,j,p1,mp,pn,x,c;
 c=PopSize*(re+cr);
 if(PopSize==9){
 c=1;
 }
 for (i=c;i<PopSize;i++){
 p1=TSelect();
 mp=myrand(0,1);
 for(j=0;j<PopLen;j++){
 if(j!=mp){
 NewPop[j]=Pop[p1][j];
 }else{
 x = myrand(1,9);
 NewPop[j] = x;
 } 
 }
 }
}

void CopyPop(){
 int i,j;
 for(i=0;i<PopSize;i++){
 for(j=0;j<PopLen;j++){
 Pop[j]=NewPop[j];
 }
 }
}

void ShowInd(int x){
 int i;
 printf("\n");
 for(i=0;i<PopLen;i++){
 printf("%d",Pop[x]);
 }
 printf("\n");
}

main(){
 int seed,gen,check=0;
 seed = (unsigned) time(NULL);
 srand(seed);
 
 gen=0;
 InitPop();
 FitEval();
 
 while(Fit[0][1]!=9 && gen<MaxGen){
 printf("\n");
 Reproduction();
 Crossover();
 Mutation();
 
 CopyPop();
 FitEval();
 gen++;
 printf("Gen = %d  Fit = %d\n",gen,Fit[0][1]);
 check=1;
 ShowPop();
 }
 
 if(check==0){
 printf("Gen = 0  Fit = 9\n",gen);
 printf("\n +++ Ans +++\n");
 ShowInd(Fit[0][0]);
 }else{
 printf("\n +++ Ans +++\n");
 ShowInd(Fit[0][0]);
 }
 
}
[/code]
แก้ไขข้อความเมื่อ
แสดงความคิดเห็น
Preview
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่