沃尔夫勒姆自动机时空图输出 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 30
242
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 }

运行效果:

时间: 2024-10-26 14:52:10

沃尔夫勒姆自动机时空图输出 C语言实现的相关文章

百度推荐~『办理谢菲尔德哈勒姆大学毕业证』原件一模一样证书

办理谢菲尔德哈勒姆大学毕业证 [微/Q:9798 3838--WeChat:9798 3838][帖子永久有效,看不到请点击百度快照]联系人Allen[办理毕业证,成绩单,学历认证.文凭.学位证.成绩单等]代办国外(海外)澳洲美国 加拿大 韩国 美国 新西兰 等各大学毕业证,修改成绩单分 数,学历认证,文凭,diploma,degree [删除请点击百度快照]真实认证.海外回囯的同学定制毕业证.真实认证.毕业证.学位证书.使馆公证.囯外真实学位认证.使馆留学回囯人员证明.录取通知书.Offer.

PAT 1006 换个格式输出 C语言

让我们用字母B来表示"百".字母S表示"十",用"12...n"来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它有2个"百".3个"十".以及个位的4. 输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000). 输出格式:每个测试用例的输出占一行,用规定的格式输出n. 输入样例1: 234 输出样例1: BBSSS1

输出C语言中 变量的类型

使用gcc的警告信息间接知道变量的类型 #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <string.h> int main() { int a[2][10]; printf("%d\n", a[0]); printf("%d\n", a); printf("%d\n", a + 1); exit(0); }

41,逆序输出——C语言初学者百题大战之二十

#include<stdio.h> int main() { int a,b,c,d,e,n; scanf("%d",&n); a=n/10000; b=n%10000/1000; c=n%10000%1000/100; d=n%10000%1000%100/10; e=n%10000%1000%100%10; if(a!=0) printf("5\n%d%d%d%d%d\n",e,d,c,b,a); else if(a==0&&

简要概述元胞自动机及其应用

谈一些自己的所学,有错误请指正. 元胞自动机( Cellular Automata) 是 20 世纪 50 年代初由计算机之父冯·诺依曼( J. von Neumann) 为了模拟生命系统所具有的自复制功能而提出来的.此后,史蒂芬·沃尔夫勒姆( Stephen Wolfram) 对元胞自动机理论进行了深入的研究,例如,他对一维初等元胞机全部 256 种规则所产生的模型进行了深入研究,并将元胞自动机分为平稳型.周期型.混沌型和复杂型 4 种类型. 元胞自动机采用离散的空间布局和离散的时间间隔,将元

元胞自动机

元胞自动机(cellular automata,CA)  元胞自动机(cellular automata,CA) 是一种时间.空间.状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力. 元胞自动机是一类模型的总称,或者说是一个方法框架.其特点是时间.空间.状态都离散,每个变量只取有限多个状态,且其状态改变的规则在时间和空间上都是局部的. 有限自动机 有限自动机是一种控制状态有限.符号集有限的自动机,是一种离散输入输出系统的数学模型. 从数学上来定义,

Mathematica

Mathematica是一款科学计算软件,很好地结合了数值和符号计算引擎.图形系统.编程语言.文本系统.和与其他应用程序的高级连接.很多功能在相应领域内处于世界领先地位,它也是使用最广泛的数学软件之一.Mathematica的发布标志着现代科技计算的开始.Mathematica是世界上通用计算系统中最强大的系统.自从1988发布以来,它已经对如何在科技和其它领域运用计算机产生了深刻的影响. Mathematica和MATLAB.Maple并称为三大数学软件. 软件名称 Mathematica 开

机器习得自然选择之力后

AI 近期关于人工智能之讨论的总结贴 涉及霍金,<超验骇客>等等. 丧心病狂的机器?杀伤性人工智能?当我们探讨自我完善软件带来的益处时,我们应该认真一下考虑这些概念. 节选自詹姆斯·巴拉的<我们最后的发明> "-我们将会开始依赖于电脑的帮助来发展出新型电脑,以生产出更为复杂的产品.然而,我们并不十分了解中间的进程,因为电脑将会领先于我们.目前,我们运用程序使电脑运行速度加快,以此使进程加快.而这正是如此令人疑惑的地方--技术在自我反馈,不再需要我们人为参与了.现在,我们就

探访莱布尼茨:与大师穿越时空的碰撞

多年来,我都对戈特弗里德·莱布尼茨很感兴趣,尤其是因为早在3个世纪以前,他就似乎想要制造一种类似Mathematica和Wolfram Alpha的工具,没准还可能会写本<一种新科学>.所以,在最近一次德国之旅中,我对能够拜访坐落在汉诺威的莱布尼茨文献馆感到兴奋不已. 翻阅着他发黄的手稿(仍旧够挺,经得起我触碰),我试着想象他写下这些篇章时的思绪,试图将我在这里看到的与3个世纪后我们所掌握的知识联系起来——这时,我感到了一种共鸣. 其中的一些记载,尤其是数学方面的,简直超越了时间,比如说下图中