首页 > 代码库 > 沃尔夫勒姆自动机时空图输出 C语言实现

沃尔夫勒姆自动机时空图输出 C语言实现

  1 #include <stdio.h>  2 #include <stdlib.h>  3 #include <time.h>  4 #include <conio.h>  5   6   7 //行宽度  8 #define ROW_LEN 38  9  10  11 //比特位域结构 12 typedef struct bits bits; 13 struct bits{ 14  15     unsigned int c0 : 1; 16     unsigned int c1 : 1; 17     unsigned int c2 : 1; 18     unsigned int c3 : 1; 19     unsigned int c4 : 1; 20     unsigned int c5 : 1; 21     unsigned int c6 : 1; 22     unsigned int c7 : 1; 23 }; 24  25  26 //行类型 27 typedef bits row[( ROW_LEN + 7 ) / 8]; 28  29  30 //读取行中元胞 31 unsigned int get_cell( row rw, int x ){ 32  33     unsigned int re = 0; 34  35  36     if( x < -1 || x > ROW_LEN ){ 37  38         puts( "get_cell: 坐标错误." ); 39  40         return re; 41     } 42  43     if( -1 == x ){ 44  45         x = ROW_LEN - 1; 46     } 47  48     if( ROW_LEN == x ){ 49  50         x = 0; 51     } 52  53  54     switch( x % 8 ){ 55  56         case 0:{ 57  58             re = rw[x / 8].c0; 59                }break; 60  61         case 1:{ 62  63             re = rw[x / 8].c1; 64                }break; 65  66         case 2:{ 67  68             re = rw[x / 8].c2; 69                }break; 70  71         case 3:{ 72  73             re = rw[x / 8].c3; 74                }break; 75  76         case 4:{ 77  78             re = rw[x / 8].c4; 79                }break; 80  81         case 5:{ 82  83             re = rw[x / 8].c5; 84                }break; 85  86         case 6:{ 87  88             re = rw[x / 8].c6; 89                }break; 90  91         case 7:{ 92  93             re = rw[x / 8].c7; 94                }break; 95     } 96  97  98     return re; 99 }100 101 102 //修改行中元胞103 void set_cell( row rw, int x, unsigned int v ){104 105 106     if( x < -1 || x > ROW_LEN ){107 108         puts( "set_cell: 坐标错误." );109 110         return;111     }112 113     if( -1 == x ){114 115         x = ROW_LEN - 1;116     }117 118     if( ROW_LEN == x ){119 120         x = 0;121     }122 123 124     v = v % 2;125 126 127     switch( x % 8 ){128 129         case 0:{130 131             rw[x / 8].c0 = v;132                }break;133 134         case 1:{135 136             rw[x / 8].c1 = v;137                }break;138 139         case 2:{140 141             rw[x / 8].c2 = v;142                }break;143 144         case 3:{145 146             rw[x / 8].c3 = v;147                }break;148 149         case 4:{150 151             rw[x / 8].c4 = v;152                }break;153 154         case 5:{155 156             rw[x / 8].c5 = v;157                }break;158 159         case 6:{160 161             rw[x / 8].c6 = v;162                }break;163 164         case 7:{165 166             rw[x / 8].c7 = v;167                }break;168     }169 }170 171 172 //演化行中元胞173 unsigned int evo_cell( row rw, int x, unsigned char tab ){174 175     unsigned char num = 0;176 177 178     if( x < 0 || x > ROW_LEN - 1 ){179 180         puts( "evo_cell: 坐标错误." );181 182         return 0;183     }184 185 186     num |= ( unsigned char )get_cell( rw, x - 1 );187     num <<= 1;188     num |= ( unsigned char )get_cell( rw, x );189     num <<= 1;190     num |= ( unsigned char )get_cell( rw, x + 1 );191 192 193     return ( tab >> num ) & 0x01;194 }195 196 197 //演化行到另外一个行198 void evo_row( row rw1, row rw2, unsigned char tab ){199 200     int x;201 202 203     for( x = 0; x < ROW_LEN; x++ ){204 205         set_cell( rw2, x, evo_cell( rw1, x, tab ) );206     }207 }208 209 210 //随机初始化行211 void rand_row( row rw ){212 213     int x;214 215 216     for( x = 0; x < ROW_LEN; x++ ){217 218         set_cell( rw, x, rand() % 2 );219     }220 }221 222 223 //显示行224 void display_row( row rw ){225 226     int x;227 228 229     for( x = 0; x < ROW_LEN; x++ ){230 231         printf( "%s", get_cell( rw, x ) ? "" : "  " );232     }233 234     printf( "\n" );235 }236 237 238 239 //规则选择,这里选择为规则30,随机产生等腰三角形240 //这种自动机是一种随机数算法的根基241 #define TYPE_ID 30242 243 244 //主函数245 int main( int argc, char * argv[] ){246 247     row rw1, rw2;248 249 250     srand( ( unsigned int )time( NULL ) );251 252     rand_row( rw1 );253 254 255     while( 1 ){256 257         display_row( rw1 );258 259         _getch();260 261         evo_row( rw1, rw2, TYPE_ID );262 263         display_row( rw2 );264 265         _getch();266 267         evo_row( rw2, rw1, TYPE_ID );268     }269 270     return 0;271 }

 

运行效果:

 

技术分享

沃尔夫勒姆自动机时空图输出 C语言实现