C 言語
2015 年 12 月 31 日 改訂
突然変異
rand() より正確と言われる random() 関数を用いて,突然変異の確率を返すプログラムです.random() は [0, 2147483647] の範囲で乱数を精製します.最大値 RNADOM_MAX 2147483647 は man random で表示される (2**31)-1 を使いました.


#include "stdio.h"
#include "stdlib.h"
#define RANDOM_MAX 2147483647
#define MAX 100
//#define MAX 10

int prob(double x);

int main ()
{
 //double mu = 0.0009/1000;
 double mu = 0.0009/10;
 int i;

 for(i=0; i < MAX; i++){
   printf("%d:", i);
   if(prob(mu) == 1) printf("1\n");
   else printf("0\n");
  }

  return 0;
}

int prob(double x)
{
 double r;
 
 random(); // 念のため一度フラッシュ.
 r=random()/(RANDOM_MAX+1.0); // 「+1」だとマイナスの値になる.「2 の補数」.
 //printf("random: %ld\t", random());
 //printf("r:%e | ", r);

 if (r < x) return 1;

 return 0;
  }
}

[i2:1spp]$ gcc -Wall mut.c
[i2:1spp]$ ./a.out
0:0
1:0
2:0
...
21:0
22:1
23:0
...
98:0
99:0
[i2:1spp]$

インストール自己参照型構造体を使った染色体の設定
chromosome.c.tar.gz

#include "stdio.h" #include "stdlib.h" #define NOTHING -1 struct chromosome { int name; int *genes; int length; struct chromosome *next_chromosome; } *first_chromosome; int chr_num = 5; int gene_len = 3; struct chromosome *new_chromosome(int chrN, int len) { struct chromosome *chp; int i; if (chrN<0) { fprintf(stderr,"Negative chrN\n"); exit(1); } if (len<0) { fprintf(stderr,"Negative length\n"); exit(1); } chp = (struct chromosome*)malloc(sizeof(struct chromosome)); if (chp==(struct chromosome*)NULL) { fprintf(stderr, "Could not allocate memory for new chromosome\n"); exit(1); } chp->genes = (int*)malloc(sizeof(int)*(len+1)); if (chp->genes==NULL) { fprintf(stderr, "Could not allocate memory for new chromosome's genes\n"); exit(1); } for (i=0; i<=len; i++) chp->genes[i] = i; chp->name = chrN; chp->length = len; if (first_chromosome == (struct chromosome*)NULL) { chp->next_chromosome = (struct chromosome*)NULL; } else { chp->next_chromosome = first_chromosome; } first_chromosome = chp; return chp; } int main() { struct chromosome *chp; int i; for (i=0; i< chr_num; i++) { new_chromosome(i, gene_len); } // PRINTOUT for (chp=first_chromosome; chp!=(struct chromosome*)NULL; chp=chp->next_chromosome) { printf("Chr%d; length:%d \n", chp->name, chp->length); for (i=0; i < gene_len; i++) printf(" genes[%d]:%d\n", i, chp->genes[i]); } return 0; }

[i2:1spp]$ gcc chromosome.c
[i2:1spp]$ ./a.out
Chr4; length:3
genes[0]:0
genes[1]:1
genes[2]:2
Chr3; length:3
genes[0]:0



リンク集
初心者のためのポイント学習 C 言語
 
gcc の使い方
 
やさしいC 第2版
コードはこちら
 
独習C 第3版

コードはこちら

プログラミング言語C
自己参照型構造体: 1, 2, Codes: 2,
 
オーキッド:バイオインフォマティクス
バイオインフォマティクスのコードが紹介されている.
 
An Introduction to C
分子配列解析のプログラミングが紹介されている.
 
Perl がくしゅう帳
K&R 第 4 章まで.
 
Serendip
K&R にある演習問題の回答.
 
clc-wiki
K&R にある演習問題の回答.英語版.
 
山口大学,プログラミングII
K&R,第 4〜7 章
 
苦しんで覚える C 言語