gene_t_p * Gene::get_random_node(){ node_list.clear(); node_list.push_back(&t_tr); get_node_list(t_tr); mt19937 mt(rd()); uniform_int_distribution<int> rd_int(0,node_list.size()-1); return node_list[rd_int(mt)]; }
int l_R() { double a,b,c,d; int i,ch,sign=0,da,db,dc; a=b=c=d=0; da=db=dc=0; if(lcount>0) return(0); ltype=0; for(GETC(ch);isblnk(ch);GETC(ch)); if(ch==',') { lcount=1; return(0); } if(ch=='/') { lquit=1; return(0); } ungetc(ch,cf); da=rd_int(&a); if(da== -1) sign=da; if(GETC(ch)!='*') { ungetc(ch,cf); db=1; b=a; a=1; } else db=rd_int(&b); if(GETC(ch)!='.') { dc=c=0; ungetc(ch,cf); } else dc=rd_int(&c); if(isexp(GETC(ch))) db=rd_int(&d); else { ungetc(ch,cf); d=0; } lcount=a; if(!db && !dc) return(0); if(db && b<0) { sign=1; b = -b; } for(i=0;i<dc;i++) c/=10; b=b+c; for(i=0;i<d;i++) b *= 10; for(i=0;i< -d;i++) b /= 10; if(sign) b = -b; ltype=TYLONG; lx=b; return(0); }
gene_t_p Gene::get_random_tree(){ //ランダムな木を再帰的に生成する gene_t_p tr = new gene_t; mt19937 mt(rd()); uniform_real_distribution<double> rd_double(0.0,1.0); if(rd_double(mt)<RAND_FRONT){ tr->mov = front; }else if(rd_double(mt) < RAND_FRONT + RAND_LR){ tr->mov = l; }else if(rd_double(mt) < RAND_FRONT + RAND_LR*2.0){ tr->mov = r; }else if(rd_double(mt) < RAND_FRONT + RAND_LR*2.0+RAND_IF){ tr->mov = if_f; do{ tr->lt = get_random_tree(); tr->rt = get_random_tree(); }while(tr->lt->mov == tr->rt->mov && tr->lt->mov != if_f && tr->lt->mov != proc); uniform_int_distribution<int> rd_int(0,NUM_IF-1); tr->n_func = rd_int(mt); switch(tr->n_func){ case 0: tr->p = &Snake::get_l_snake; break; case 1: tr->p = &Snake::get_f_snake; break; case 2: tr->p = &Snake::get_r_snake; break; case 3: tr->p = &Snake::get_l_food; break; case 4: tr->p = &Snake::get_f_food; break; case 5: tr->p = &Snake::get_r_food; break; case 6: tr->p = &Snake::get_food_front; break; case 7: tr->p = &Snake::get_food_left_side; break; case 8: tr->p = &Snake::get_food_right_side; break; default: printf("Error if function\n"); exit(1); } }else{ tr->mov = proc; do{ tr->lt = get_random_tree(); tr->rt = get_random_tree(); }while(tr->lt->mov == tr->rt->mov && tr->lt->mov != if_f && tr->lt->mov != proc); } return tr; }