#include <stdio.h> double drand48(); #define W 0 /* 白 */ #define B 1 /* 黒 */ #define PN 4 /* パターン数 */ #define N1 10 /* 縦または横の数 */ #define N2 N1 /* 同上 */ int P[N1][N2]; /* パターン配列 */ FILE *f; main(argc,argv) int argc; char *argv[]; { int i,ran_n; char fname[50]; /* コマンドラインのパラメータの使用方法 */ if(argc != 2){ printf("pat_s <乱数初期値>\n"); exit(-1); } ran_n = atoi(argv[1]);/* 乱数初期値 */ sprintf(fname,"pat_%lu.dat",ran_n); f=fopen(fname,"w"); srand48(ran_n); for(i=0; i<PN; i++) ratio(); /* パターン作成 */ fclose(f); } /* パターン作成 */ ratio() { int rat,i,j,sum,n; sum=0; /* 平均 0.5 管理変数 */ /* 一列当たりの黒白の数を決定 */ for(i=0; i<N1; i++){ rat=(int)(drand48()*11); if(rat > (n = N1*N2/2-sum)) rat = n; if(rat < (n = N1*(i-4)-sum)) rat = n; pattern(rat,i); /* 一列のパターンを決定 */ sum += rat; } henkou(); /* 縦横を一部順序変更 */ /* 全体の順序を変更しファイルへ出力 (左右上下)*/ if(drand48() < 0.5) if(drand48() < 0.5) for(i=0; i<N1; i++){ for(j=0; j<N2; j++) fprintf(f,"%d ",P[i][j]); fprintf(f,"\n"); } else for(j=0; j<N2; j++){ for(i=0; i<N1; i++) fprintf(f,"%d ",P[i][j]); fprintf(f,"\n"); } else if(drand48() < 0.5) for(i=N1-1; i>=0; i--){ for(j=N2-1; j>=0; j--) fprintf(f,"%d ",P[i][j]); fprintf(f,"\n"); } else for(j=N2-1; j>=0; j--){ for(i=N1-1; i>=0; i--) fprintf(f,"%d ",P[i][j]); fprintf(f,"\n"); } fprintf(f,"\n"); } /* 一列のパターンを決定 */ pattern(rat,i) int rat,i; { int j,sum; sum = 0; /* 黒が rat と等しくなるように作成 */ for(j=0; j<N2; j++) { if(drand48() < (double)rat/10) P[i][j] = B; else P[i][j] = W; if(sum == rat) P[i][j] = W; if(j-sum == N2-rat) P[i][j] = B; sum += P[i][j]; } } /* 縦横を一部順序変更 */ henkou() { int a,b,i,j; /* 縦 (または横) */ for(i=0; i<N1; i++){ if(drand48() < 0.5) for(j=0; j< N2/2; j++){ a=P[i][j]; P[i][j]=P[i][N2-1-j]; P[i][N2-1-j]=a; } } /* 横(または縦) */ for(j=0; j<N2; j++){ if(drand48() < 0.5) for(i=0; i<N1/2; i++){ b=P[i][j]; P[i][j]=P[N1-1-i][j]; P[N1-1-i][j]=b; } } }