• 締切済み

遺伝子アルゴリズムの2点交叉について教えてください

下記のプログラムを改良して2点交叉にしたいのですが、遺伝子アルゴリズムもC++も初心者なので、よくわかりません。どなたかお知恵を貸してください。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include "come.h" int kousa() { unsigned int max=100; unsigned int max2=17; int a,b,c,d; int i,v,w,y,n,o,k,p,f; char kari[1][17]; w=0;//カウンタ n=0; srand((unsigned)time(NULL)); for(v=0;v<100;v++) { for(i=0;i<17;i++) { get[v][i]=next[v][i]; //next[175][17]からget[100][17]へコピーする(親) } } for(o=0;o<100;o++) { for(k=0;k<17;k++) { take[o][k]=next[v][k]; //next[175][17]からtake[100][17]へコピーする(子) } } for(d=0;d<50;d++) { a=(rand()%max); //1つ目の交叉する列を見つける b=(rand()%max); //2つ目の交叉する列を見つける c=(rand()%max2); //交叉ポイント見つける for(;c<17;c++) //1点交叉 { kari[n][c]=get[a][c]; get[a][c]=get[b][c]; get[b][c]=get[n][c]; } for(y=0;y<17;y++) { take[w][y]=get[a][y]; //get[100][17]からtake[50][17]へコピー take[w+1][y]=get[b][y]; } w=w+2; } for(p=0;p<100;p++) { for(f=0;f<17;f++) { next[nextpop][f]=take[p][f]; } nextpop++; } return 0; }

みんなの回答

  • fonera
  • ベストアンサー率52% (38/72)
回答No.2

恐れ入ります。No.1で回答したものです。 >回答のプログラムを直接入力すると、kari[i] = get[father][i];の所で「左のオペランドが、左辺値になっていません」、というエラーが起きるので、変数iの部分がどう変えればいいか教えてもらえませんか? 参考にしていただいて、自身で作り直していただくのが一番なのですが、 追加で回答しておきます。 できるだけ元々のソースを残したまま、追加・修正しました。 (追加した部分は、ソース内にコメントを入れました。元ソースと比較して、何をしているか考えてみて下さい) なお、再度繰り返しますが掲載されたソースが「部分抜粋」で、「ソース全て」ではありません。全て載せていただけなければ、これ以上は判断が付きかねます。 (どんなプログラムの一部なのか推測するしかないので、弄りようがないです) 動かなかった場合は、全てのソースをおみせ願えないでしょうか。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include "come.h" int kousa() { unsigned int max=100; unsigned int max2=17; int a,b,c,d; int father, mother, point_1, point_2, temporary;/* 2点交叉で使う変数 */ int i,v,w,y,n,o,k,p,f; char kari[1][17]; w=0;//カウンタ n=0; father = mother = point_1 = point_2 = temporary = 0; /* 初期化 */ srand((unsigned)time(NULL)); for(v=0;v<100;v++) { for(i=0;i<17;i++) { get[v][i]=next[v][i]; //next[175][17]からget[100][17]へコピーする(親) } } for(o=0;o<100;o++) { for(k=0;k<17;k++) { take[o][k]=next[v][k]; //next[175][17]からtake[100][17]へコピーする(子) } } for(d=0;d<50;d++) { father = (rand() % max); /* 1つめの交叉する列を見つける */ mother = (rand() % max); /* 2つめの交叉する列を見つける */ point_1 = (rand() % max2); /* 交叉ポイントを見つける */ point_2 = (rand() % max2); /* 交叉ポイントを見つける */ /*↓から2点交叉*/ for(i = 0; i < 17; i++) { if (i < point_1) { temporary = get[father][i]; get[father][i] = get[mother][i]; get[mother][i] = temporary; } if (i < point_2) { temporary = get[father][i]; get[father][i] = get[mother][i]; get[mother][i] = temporary; } } /* ↑まで2点交叉 */ for(y=0;y<17;y++) { take[w][y]=get[a][y]; //get[100][17]からtake[50][17]へコピー take[w+1][y]=get[b][y]; } w=w+2; } for(p=0;p<100;p++) { for(f=0;f<17;f++) { next[nextpop][f]=take[p][f]; } nextpop++; } return 0; }

全文を見る
すると、全ての回答が全文表示されます。
  • fonera
  • ベストアンサー率52% (38/72)
回答No.1

恐れ入ります。 ざっと読みましたが、質問に掲載されたプログラムが部分抜粋のようですので、不明点が多いです。推測して回答します。 遺伝的アルゴリズムの基礎はご存じですか? 質問に掲載されたプログラムは ・100の個体で、遺伝子数は17。(遺伝子の中身は不明) ・100の個体を、ランダムに50ペア選び交叉させる。 ・交叉後、親の個体は保持されない。子が親に取って代わる。 ・親集団は交叉中に変化する。親集団は全て破棄され、子が生まれる度に次集団にコピーされる。 # 1点交叉の get[b][c]=get[n][c];は、get[b][c]=kari[n][c];の間違いかと思いますがどうでしょうか? 通常遺伝的アルゴリズムと呼ばれているモノからすると、かなり変則的なアルゴリズムになっています。一度参考書などで確認された方がよろしいかと思います。 上記のプログラムのまま、2点交叉にしたいだけでしたら簡単です。 1点交叉は 親A 00000 親B 11111 の時に、 子C 11000 子D 00111 のようになります。 2点交叉は 親A 00000 親B 11111 の時に、 子C 11001 子D 00110 のように、交換場所が2カ所になるだけです。 つまり father = (rand() % max); mother = (rand() % max); point_1 = (rand() % max2); point_2 = (rand() % max2); for(i = 0; i < 17; i++) { if (i < point_1) { kari[i] = get[father][i]; get[father][i] = get[mother][i]; get[mother][i] = kari[i]; } if (i < point_2) { kari[i] = get[father][i]; get[father][i] = get[mother][i]; get[mother][i] = kari[i]; } } これで、point_1かつpoint_2の場合には2回交換して元に戻ることで、2点交叉が実現できます。(もっとエレガントな方法もありますが、理解しづらくなってしまいますので。ご自身でお考え下さい) 変数名の名前の付け方や、冗長部分のまとめ方などは、参考書を参考にしながらご自身でなされた方がよいかと思います。

iris0625
質問者

お礼

お礼が遅くなって申し訳ありません。とても参考になりました。

iris0625
質問者

補足

回答のプログラムを直接入力すると、kari[i] = get[father][i];の所で「左のオペランドが、左辺値になっていません」、というエラーが起きるので、変数iの部分がどう変えればいいか教えてもらえませんか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 交叉について

    c言語を使い始めて、TSPについて勉強中で、遺伝的アルゴリズムの交叉(順序交叉)について以下のプログラムを作ってみたのですが、凄く遅いです。答えはきちんと出るのですが、循環交叉を取り入れたプログラムは5000ループでも1秒弱で出るのに対して20秒近くかかってしまいます。ループに無駄が多そうなのですが思いつきません。ヒントでも宜しいのでご教授下さい。 順序交叉とは、例えば x[i] = 3,4,5,2,1とy[i] = 4,3,5,1,2(i = 0~)という数字が与えられたときtargetを2とすると x[i] = 3,4, y[i] = 4,3まではそのまま受け継ぎ、3以降は相手方の数字を左から順番に使われていないものを取り入れていくものです。この場合だと、x[i] = 3,4,5,1,2 y[i] = 4,3,5,2,1となります。 #define a 5 int main(void) {    int x[a] = {3, 4, 5, 2, 1}, y[a] = {4, 3, 5, 1, 2};    int target, i, j, k, l;    int x2[a], y2[a];    srand((unsigned)time(NULL));    target = rand () % a;    for (i = 0; i < target; i++) {       x2[i] = x[i];       y2[i] = y[i];    }    for (i = target; i < a; i++) {       x2[i] = 0;       y2[i] = 0;    }    j = 0;    k = 0;    while (k != a - target) {       for (i = 0; i < target + k; i++) {          for (l = 0; l < target + k; l++) {             if (x2[l] == y[j])                j++;          }       }       if (x2[target + k] != y[j]) {          x2[target + k] = y[j];          k++;          j++;       }       else          j++;    }    yについても同様の作業です }

  • C言語 遺伝的アルゴリズムでのエラーについて

    与えられた乱数を二つのグループにわけ、その差が小さくなるようなプログラムを書いているつもりです。 が、コンパイルし、実行したところsegmentation fault が表示されます。 segmentation fault が表示される理由はわかっていますが、どこでそういった現象がおこっているのか判断できない状況です。 どなたかよろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> //染色体の数 #define Number_of_ch 10 //エリート選抜の割合 #define Selection 0.3 //交叉率 #define Cross_ratio 0.7 //突然変異率 #define Mutation_ratio 0.1 //ループ回数 #define Number_of_loop 100 int main(int argc , char *argv[]) { int f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,x,y,z; int Number_of_gene = argc-1;//遺伝子の数 int chromosome[Number_of_ch][Number_of_gene],distmin[Number_of_gene];//染色体と遺伝子 int best_chromosome[Number_of_gene],Number_of_cross=0,ch_1=0,ch_2=0,point=0,temp=0,temp_1=0,temp_2=0,abc=0,loop=0; float real_Number[Number_of_gene] , dist[Number_of_ch] , best = 100.0; float sum0 = 0.0 , sum1 = 0.0 ; //入力値の記録 for(i=0 ; i<argc ; i++){ real_Number[i] = atof(argv[i+1]); } srand((unsigned)time(NULL)); //染色体の初期化 for(j=0 ; j<Number_of_ch ; j++){ for(k=0 ; k<Number_of_gene ; k++){ chromosome[j][k] = rand() % 2;//0 or 1のグループ分け } } //----------------------ループ開始------------------------ while(loop < Number_of_loop){ //差分 for(l=0 ; l<Number_of_ch ; l++){ for(m=0 ; m<Number_of_gene ; m++){ if(chromosome[l][m] == 0){ sum0 = sum0 + real_Number[k]; } else{ sum1 = sum1 + real_Number[k]; } } dist[l] = abs(sum1 - sum0); } //評価と記憶 for(n=0 ; n<Number_of_ch ; n++){ if(dist[n] < best){ best = dist[n]; for(o=0 ; o<Number_of_gene ; o++){ best_chromosome[o] = chromosome[n][o]; } } } //ソート for(p=0 ; p<Number_of_ch ; p++){ for(q=1 ; q<Number_of_ch-p+1 ; q++){ if(dist[q-1] > dist[q]){ for(r=0 ; r<Number_of_gene ; r++){ distmin[r] = chromosome[q][r]; chromosome[q][r] = chromosome[q-1][r]; chromosome[q-1][r] = distmin[r]; } } } } //エリートの選抜 for(s=Number_of_ch*Selection ; s<Number_of_ch ; s++){ for(t=0 ; t<Number_of_gene ; t++){ chromosome[s][t] = best_chromosome[t]; } } //交叉 Number_of_cross = Number_of_ch * Cross_ratio; for(u=0 ; u<Number_of_cross ; u++){ ch_1 = (Number_of_ch-1) * (rand()/32767); ch_2 = (Number_of_ch-1) * (rand()/32767); point = (Number_of_gene-1) * (rand()/32767); for(x=point ; x<Number_of_gene ; x++){ temp_1 = chromosome[ch_1][x]; for(y=0 ; y<Number_of_gene ; y++){ if(chromosome[ch_1][x] == chromosome[ch_2][y]){ temp_2 = chromosome[ch_2][x]; chromosome[ch_2][x] = chromosome[ch_2][y]; chromosome[ch_2][y] = temp_2; } for(z=0 ; z<Number_of_gene ; z++){ if(chromosome[ch_2][x] == chromosome[ch_1][z]){ chromosome[ch_1][x] = chromosome[ch_1][z]; chromosome[ch_1][z] = temp_1; } } } } } //突然変異 for(f=0 ; f<Number_of_cross ; f++){ for(g=0 ; g<Number_of_gene ; g++){ if(rand()/32767 < Mutation_ratio){ abc = (Number_of_gene-1) * (rand()/32767); temp = chromosome[f][g]; chromosome[f][g] = chromosome[f][abc]; chromosome[f][abc] = temp; } } } loop = loop + 1; } //結果の出力 printf("# best = %f \n",best); for(h=0 ; h<Number_of_gene ; h++){ printf("%d",best_chromosome[h]); } printf("\n"); }

  • C言語 遺伝的アルゴリズムでのエラーについて

    再度質問させていただきます。 以下のプログラムを実行するとsegmentation faultが出たり出なかったりします。 いまいち原因が分からないので回答お願いします。 ちなみに目的としては、 0~1の乱数が複数個与えられたときに、与えられた乱数を2つのグループに分け、その2グループの差ができるだけ小さくなるようにする。 といったものです。 よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> //染色体の数 #define Number_of_ch 10 //エリート選抜の割合 #define Selection 0.3 //交叉率 #define Cross_ratio 0.7 //突然変異率 #define Mutation_ratio 0.2 //ループ回数 #define Number_of_loop 100 int main(int argc , char *argv[]) { int f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,x,y,z; long int Number_of_gene = argc-1;//遺伝子の数 int chromosome[Number_of_ch][Number_of_gene],distmin[Number_of_gene];//染色体と遺伝子 int best_chromosome[Number_of_gene],Number_of_cross=0,ch_1=0,ch_2=0,point=0,temp=0,temp_1=0,temp_2=0,abc=0,loop=0; double real_Number[Number_of_gene] , dist[Number_of_ch]; double best = 100.0; double sum0 = 0.0 , sum1 = 0.0 ; //入力値の記録 for(i=0 ; i<Number_of_gene ; i++){ real_Number[i] = atof(argv[i+1]); } srand((unsigned)time(NULL)); //染色体の初期化 for(j=0 ; j<Number_of_ch ; j++){ for(k=0 ; k<Number_of_gene ; k++){ chromosome[j][k] = rand() % 2;//0 or 1のグループ分け } } //----------------------ループ開始------------------------ while(loop < Number_of_loop){ //差分 for(l=0 ; l<Number_of_ch ; l++){ for(m=0 ; m<Number_of_gene ; m++){ if(chromosome[l][m] == 0){ sum0 = sum0 + real_Number[m]; } else{ sum1 = sum1 + real_Number[m]; } } if(sum0 > sum1){ dist[l] = sum0 - sum1; } else{ dist[l] = sum1 - sum0; } } //評価と記憶 for(n=0 ; n<Number_of_ch ; n++){ if(dist[n] < best){ best = dist[n]; for(o=0 ; o<Number_of_gene ; o++){ best_chromosome[o] = chromosome[n][o]; } } } //ソート for(p=0 ; p<Number_of_ch ; p++){ for(q=1 ; q<Number_of_ch-p+1 ; q++){ if(dist[q-1] > dist[q]){ for(r=0 ; r<Number_of_gene ; r++){ distmin[r] = chromosome[q][r]; chromosome[q][r] = chromosome[q-1][r]; chromosome[q-1][r] = distmin[r]; } } } } //エリートの選抜 for(s=Number_of_ch*Selection ; s<Number_of_ch ; s++){ for(t=0 ; t<Number_of_gene ; t++){ chromosome[s][t] = best_chromosome[t]; } } //交叉 Number_of_cross = Number_of_ch * Cross_ratio; for(u=0 ; u<Number_of_cross ; u++){ ch_1 = (Number_of_ch-1) * (rand()/32767); ch_2 = (Number_of_ch-1) * (rand()/32767); point = (Number_of_gene-1) * (rand()/32767); for(x=point ; x<Number_of_gene ; x++){ temp_1 = chromosome[ch_1][x]; for(y=0 ; y<Number_of_gene ; y++){ if(chromosome[ch_1][x] == chromosome[ch_2][y]){ temp_2 = chromosome[ch_2][x]; chromosome[ch_2][x] = chromosome[ch_2][y]; chromosome[ch_2][y] = temp_2; } for(z=0 ; z<Number_of_gene ; z++){ if(chromosome[ch_2][x] == chromosome[ch_1][z]){ chromosome[ch_1][x] = chromosome[ch_1][z]; chromosome[ch_1][z] = temp_1; } } } } } //突然変異 for(f=0 ; f<Number_of_cross ; f++){ for(g=0 ; g<Number_of_gene ; g++){ if(rand()/32767 < Mutation_ratio){ abc = (Number_of_gene-1) * (rand()/32767); temp = chromosome[f][g]; chromosome[f][g] = chromosome[f][abc]; chromosome[f][abc] = temp; } } } loop = loop + 1; } //結果の出力 printf("# best = %f \n",best); for(h=0 ; h<Number_of_gene ; h++){ printf("%d",best_chromosome[h]); } printf("\n"); }

  • 遺伝的アルゴリズム

    遺伝的アルゴリズムのプログラムを作っているのですがサンプルソースの下の関数のやってこるこがよく意味がわかりません。よかったら解説 お願いします。 // 一点交叉 void one_point_crossover(struct genotype *ind) { int i, ia, ib; // 個体インデックス int j; // 遺伝子座インデックス int c; // 交叉点 int test[M]; // 個体の利用フラグ int temp[N]; // 遺伝子を入れ替えるための仮変数 // 4/24修正 int r; // 乱数値 for(i=0; i<M; i++) test[i] = 0; ia = ib = 0; for(i=0; i<M/2; i++) { // 個体をランダムにペアリング for(; test[ia]==1; ia=(ia+1)%M); test[ia] = 1; r = random() % (M-2*i) + 1; while(r>0) { ib=(ib+1)%M; for(; test[ib]==1; ib=(ib+1)%M); r--; } test[ib] = 1; // 個体iaとibを交叉 if(flip(Pc)) { c = random() % N; for(j=0; j<c; j++) { temp[j] = ind[ia].gene[j]; ind[ia].gene[j] = ind[ib].gene[j]; ind[ib].gene[j] = temp[j]; } } } } // End of one_point_crossover()

  • モンテカルロ法を用いた実験

    モンテカルロ法を用いてy=x^2とx軸で囲まれた部分の面積の近似値を求める.これを利用して平均μ,標準偏差σ,を求めたところ下記の写真のようになった.点数nに対して標準偏差は何次であるかを,中心極限定理から求められる次数,実験結果から導かれる次数のそれぞれで求めなさい.次数とはどのように求められるのでしょうか?使用したプログラムを下に書いておきます. #include <stdio.h> #include <time.h> #include <stdlib.h> #include <math.h> double f(double x); int main(void) { int M = 1000; int i,j,n,c,k; int tmp[6] = { 20, 50, 100, 200, 500, 1000 }; double x,y,Y, sumY, sumY2, muY, muY2, sigmaY; srand((unsigned int)time(NULL)); for (k = 0; k < 6; k++){ sumY = 0; sumY2 = 0; for (j = 0; j < M; j++){ c = 0; n = tmp[k]; for (i = 0; i < n; i++){ x = (1.0* (double)rand()) / ((double)RAND_MAX + 1.0); y = (1.0* (double)rand()) / ((double)RAND_MAX + 1.0); if (y <= f(x)){ c++; } } Y = ((double)c) / (double)n; sumY = sumY + Y; sumY2 += Y*Y; } muY = sumY / (double)M; muY2 =sumY2 / (double)M; sigmaY = sqrt(muY2 -(muY*muY)); printf("%d %lf %lf\n", n, muY, sigmaY); } return 0; } double f(double x) { double r = x * x; return r; }

  • 数独を解くアルゴリズム

    バックトラック法で解いているのですが、どこがおかしいのか見当もつかないので教えてください。 コンパイルエラーはありません。 表示の関数は省いてあります。 よろしくお願いします。 #include <stdio.h> #define M 3 //小さいブロックのサイズ #define N M*M //全体のサイズ #define MTX N*N //全体のマス数 int sudoku[N][N]={    {0,2,4,5,0,0,6,0,0},    {0,0,6,3,2,0,0,0,4},    {0,0,5,0,9,0,0,8,3},    {0,0,8,4,0,3,0,0,1},    {0,6,1,9,0,0,4,3,0},    {7,0,0,1,0,0,5,0,0},    {8,3,0,0,4,0,9,0,0},    {4,0,0,0,3,5,8,0,0},    {0,0,7,0,0,9,3,4,0}    }; /* 候補がOKかどうかチェック */ int OKkouho(int x, int y, int k) {    int i,j;    int p,q;    for(i=0; i < N; i++){ //その行に候補は入るか       if(sudoku[y][i] == k)          return 0;    }    for(j=0; j < N; j++){ //その列に候補は入るか       if(sudoku[j][x] == k)          return 0;    }    p = x/M*M;    q = y/M*M;    //そのブロックに候補は入るか    for(j = q; j < q+M; j++){       for(i = p; i < p+M; i++){          if(sudoku[j][i] == k)             return 0;       }    }    return 1; } void Solve(int level) {    int k;    int x,y;    if(level >= MTX){       printf("OK");       return;    }    x = level%N;    y = level/N;    if(sudoku[y][x])       Solve(level+1);    else{       for(k = 1; k <= N; k++){          if(OKkouho(x,y,k)){             sudoku[y][x] = k;             Solve(level+1);             sudoku[y][x] = 0;             }       }    } } int main(void) {    Solve(0);    return 0; }

  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

  • 出現文字の種類の数

    下記のプログラムのファイルから読み込んだ出現文字の種類の数を取得するにはどうすれば良いでしょうか? また、 ー アルファベットでは大文字を全て小文字に置換 ー スペース、タブ、改行記号はスペースに置換 ー 数字は全て0に置換 ー その他の記号はそのまま使う という条件になっています。 #include<stdio.h> #include<ctype.h> #include<math.h> int cnt[256]; char chs[256]; int n=256; int main(void) { int k; for(k=0;k<n;k++) cnt[k]=0; inputdata(); heapsort(1,n); printdata_reverse(); } void inputdata() { char c; char *fnam="English.txt"; FILE *fp; char bff[80]; char *p; int k; fp = fopen(fnam,"r"); while(fgets(bff,80,fp)!=NULL) { for(p=bff;*p;p++) { c = *p; if(isalpha(*p)) c=tolower(*p); if(isdigit(*p)) c = '0'; if(isspace(*p)) c = ' '; cnt[c]++; chs[c] = c; } } fclose(fp); } void heapsort(int s,int t) { int i; makeheap(s,t); for(i = t; i>= s+1; i--) { swap(s,i); heapify(s,i-1); } } void makeheap(int s,int t) { int i; for(i = t; i >= s; i--) heapify(i,t); } void heapify(int p,int q) { int r; r = 2*p; if(r <= q){ if(r < q && cnt[r] > cnt[r+1]) r = r+1; if(cnt[p] > cnt[r]){ swap(p,r); heapify(r,q); } } } void swap(int i, int j) { int temp1,temp2; temp1=cnt[i]; cnt[i]=cnt[j]; cnt[j]=temp1; temp2=chs[i]; chs[i]=chs[j]; chs[j]=temp2; } void printdata_reverse() { int k; int m=0; double pcnt[100]; for(k=0;k<n;k++) { if(cnt[k]>0) m += cnt[k]; } printf("Characters in UN Charter.\n"); printf(" # C occ. %%\n"); for(k=0;k<n;k++) { if(cnt[k]>0) { pcnt[k] = 1.0*cnt[k]/m; printf("%3d '%c' %5d %f\n", k,chs[k],cnt[k],pcnt[k]); } } } 実行結果 Characters in UN Charter. # C occ. % 1 ' ' 4576 0.190643 2 'e' 2804 0.116819 3 't' 1827 0.076115 4 's' 1464 0.060992 5 'o' 1339 0.055785 6 'a' 1315 0.054785 7 'n' 1313 0.054701 8 'r' 1257 0.052368 9 'i' 1103 0.045953 10 'h' 972 0.040495 11 'c' 755 0.031454 12 'l' 645 0.026872 13 'd' 639 0.026622 14 'u' 593 0.024705 15 'f' 492 0.020497 16 'p' 430 0.017914 17 'm' 400 0.016665 18 'g' 285 0.011874 19 '0' 278 0.011582 20 'b' 253 0.010540 21 '.' 238 0.009915 22 'v' 203 0.008457 23 'y' 199 0.008291 24 ',' 192 0.007999 25 'w' 167 0.006957 26 '-' 54 0.002250 27 'k' 38 0.001583 28 'x' 34 0.001416 29 ''' 30 0.001250 30 'j' 27 0.001125 31 '(' 20 0.000833 32 ')' 20 0.000833 33 'z' 17 0.000708 34 'q' 13 0.000542 35 ':' 11 0.000458

  • CPadでのアニメーションについて

    CPadでC言語を使ってアニメーションを作っているのですが、なにかいい例はないでしょうか。プログラムの形はこんなのです。↓ #include <glibw32.h> #include <windows.h> #include <stdlib.h> void main() { int i,j,k,l,m,n; ginit(512,512); GRAPH g; setcolor256(1,7); g.setlinestyle(0,3); for(l=0;l<50;l++) { j=(int)(double)rand()*500.0/RAND_MAX)+200; k=(int)(double)rand()*500.0/RAND_MAX)+200; for(n=0;n<100;n++) { g.cls(); fori=0;i<128;i++) { g.setcolor(i*2); g.setlinestyle(0.i/24); g.line(j-i-(n*2),k-i-(n*2),j-i-(n*2),k-i-(n*2)); } Sleep(10); } } delcolor256(); gend(); } 上記プログラムでは流れ星のようなものが現れます。C言語についてあまり知らないので何のプログラムを作っているのかわからない、何を聞きたいのかわからない、と思われるでしょうがそれを承知の上でお願いします。

  • 座標をランダムに表示させてx座標順にソートするプログラムを考えています

    座標をランダムに表示させてx座標順にソートするプログラムを考えています とりあえず、以下の様に決まった数の座標でソートすることはできたのですが、ランダムにするとなるとどうすればいいのかわかりません。 ------------------------------------------------- #include <stdio.h> int makepoints(int * pn, double * x, double * y){ double xp,yp; int k; int i,j; int n; n = 7; *pn = n; xp = 1; for(k=0;k<n;k++) { xp = xp/2; yp = xp*xp; x[k] = xp; y[k] = yp; } printf("初期座標列:\n"); for(k=0;k<n;k++) { printf("%f_%f\n",x[k],y[k]); } for(j=1;j<n;j++) { for(i=0;i<j;i++) { if(x[i]>x[j]){ xp=x[i];x[i]=x[j];x[j]=xp; yp=y[i];y[i]=y[j];y[j]=yp; } } } printf("整列後の座標列:\n"); for(k=0;k<n;k++) { printf("%d %f %f\n",k ,x[k],y[k]); } return 0; } ------------------------------------------------- なんとなくrand関数を使えばいいのかな、というのはわかるのですが、プログラミングに弱く困っています。 この後のプログラミング教えてくださる方いればよろしくお願いします。