书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
0.2 随机游走类
1、面向对象编程(OOP)
对象编程(Object-oriented Programming,OOP)
2、对象
对象是拥有数据和功能的实体。
我们要建立的Walker对象有以下特点:
- 既维持了自身数据(在屏幕中的位置),
- 又能够执行某些动作(比如绘制自身或者移动一步)。
3、类
类是构建对象实例的模板,
我们可以这么比喻它和对象的关系:
- 类就是用来切割曲奇的模具,
- 而对象就是曲奇。
4、定义一个Walker类
Walker对象的模板。
- Walker对象只需要两部分数据——x坐标和y坐标。
- 除了数据,我们还可以在类中定义对象的功能函数。
class Walker {
int x,y;
Walker() {
x = width/2;
y = height/2;
}
void render() {
stroke(255);
point(x,y);
}
// Randomly move to any neighboring pixel (or stay in the same spot)
void step() {
int stepx = int(random(3))-1;
int stepy = int(random(3))-1;
x += stepx;
y += stepy;
x = constrain(x,0,width-1);
y = constrain(y,0,height-1);
}
}
5、“传统”随机游走模型
“传统”随机游走模型中的上述变量,都有一个共同点:
- 在任意时刻,游走对象朝某一个方向移动的概率等于它朝其他任意方向移动的概率。
比如,如果游走对象有4个可能的移动方向,它朝某个方向移动一步的概率就是1/4(25%);
如果它有9个可能的移动方向,朝某个方向移动的概率是1/9(11%)。
Walker w;
void setup() {
size(200,200);
// Create a walker object
w = new Walker();
background(0);
}
void draw() {
// Run the walker object
w.step();
w.render();
}
简单地说,这就是random()函数的工作方式,Processing的随机数生成器产生的随机数是均匀分布的。
6、均匀分布
我们可以用Sketch测试这种均匀分布:不断地产生某个区间内的随机数,并根据各个随机数的出现次数绘制柱状图。
int[] randomCounts;
void setup() {
size(640,240);
randomCounts = new int[20];
}
void draw() {
int index = int(random(randomCounts.length));
randomCounts[index]++;
stroke(0);
fill(127);
int w = width/randomCounts.length;
for (int x = 0; x < randomCounts.length; x++) {
rect(x*w,height-randomCounts[x],w-1,randomCounts[x]);
}
}
7、伪随机数
我们从random()函数中取得的随机数并不是真正随机的,因此它们称为"伪随机数"。
它们是由模拟随机的数学函数生成的。随着时间推移,这个函数将呈现出固定的模式,但那段时间很长,所以对我们来说,它的随机性已经足够了。