模拟沉积法

在一次随机化算法测试中我无意发现,通过粒子的随机移动和沉积可构造类似如下图形

   

首先初始化一个N*N的网格,其中每个格子有几率p1被放置一个粒子,状态设为活跃,在中心放置一个非活跃粒子,

随机选择一个活跃粒子和移动方向(上下左右),若粒子的这个方向上1格没有粒子或边界则移动,若粒子接触到非活跃粒子则有p2几率变为非活跃粒子(沉积),

直到所有粒子变为非活跃状态,算法结束。

通常p1取0.05~0.2,p2取0.5~1.0,也可以对不同的粒子设置不同的p1,p2

加入重力等其它规则有时可以得到意想不到的效果

测试表明此算法在p1=0.1,p2=1时期望时间复杂度大约是O(n4),然而我没有能力证明。

以下是一个简单的实现

#include<cstdio>
#include<cstdlib>
#include<ctime>
const int N=200;
const double p1=0.1;
const double p2=1.0;
int xs[]={-1,0,1,0};
int ys[]={0,-1,0,1};
int bmp[N+2][N+2];
struct pos{
    int x,y;
    pos(){}
    pos(int a,int b):x(a),y(b){}
}ps[N*N];
int p=0;
int main(){
    srand(time(0));
    for(int i=0;i<=N+1;i++)//边界
        bmp[0][i]=bmp[N+1][i]=bmp[i][0]=bmp[i][N+1]=-1;
    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
            if(rand()<RAND_MAX*p1){//初始化
                bmp[i][j]=1;
                ps[p++]=pos(i,j);
            }
    bmp[N/2+1][N/2+1]=2;
    while(p){
        int w=rand()%p;
        int x=ps[w].x,y=ps[w].y;
        int f=rand()&3;
        bool d=0;
        if(bmp[x][y]==2)d=1;
        else for(int i=0;i<4;i++)
            if(bmp[x+xs[i]][y+ys[i]]==2)
                d=1;
        if(d&&rand()<p2*RAND_MAX){//沉积
            bmp[x][y]=2;
            ps[w]=ps[--p];
            continue;
        }
        if(bmp[x+xs[f]][y+ys[f]]==0){//移动
            bmp[ps[w].x=x+xs[f]][ps[w].y=y+ys[f]]=1;
            bmp[x][y]=0;
        }
    }  //结果保存在数组bmp中
    return 0;
}

暂时并没有什么实用价值。。

时间: 2024-10-22 00:14:16

模拟沉积法的相关文章

模拟棋盘法计算遗传中概率

#include<cstdio> #include<cstring> using namespace std; int m[5][5],w[3][3],s[10],b[3][3],c[5],ans[10][10]; char fa[100],ma[100],qu[100]; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int main() { int tar; printf("请输入亲本基因类型:\n"); p

脱壳-&gt;模拟追踪脱壳法原理

目录 模拟追踪脱壳法 一丶模拟追踪 1.1 模拟追踪简介 1.2 模拟追踪法的原理 1.3 网络上的内存镜像法与模拟追踪 二丶调试工具的使用 2.1 x64dbg追踪的使用 2.2 Ollydbg工具的使用 三丶总结 模拟追踪脱壳法 一丶模拟追踪 1.1 模拟追踪简介 模拟追踪 重点是模拟两字, 含义就是程序代替人手工的F7(步进) 或者 F8(步过) 回想我们手工脱壳的时候,最笨的方法就是遇到Call跳过(F8) 如果跑飞就遇到Call F7 但是往往最笨的方法就是最好用的方法. 原理也说过.

哈希(hash) 之插入和查找(链地址法)

一:学些心得 1 getHash函数的设计最牛的是Unix中处理字符串的ELFHash():当然也可以自己写一个比较简单的getHash函数关键在于去mod M的M值,使器均匀的分布(一般是不大于hash_size的某一个素数,接近于2的某次幂):但是有一点需要注意就是返回的hash值必须是正值. 2 处理冲突的方法:链地址法是比较好的方法了(静态动态都可以的):二次哈希(一般是加key值)再探测:或者加1再探测 3 插入和查找以及删除的第一步都是一样的,getHash(),时候存在-- 4 对

地震及断层分析相关软件

IRIS(Incorporated Research Institutions for Seismology)(https://seiscode.iris.washington.edu/)共享软件: Conversion Program: 格式转换,包含大量sac, seed, 等格式的相互转换程序. Data Collection :数据收集,自动网络数据查询,下载程序及程序包. Data Exchange:数据交换.主要是应用于学校教育等的目的的数据共享类软件. Data Extractio

分布式机器学习的集群方案介绍之HPC实现

机器学习的基本概念 机器学习方法是计算机利用已有的数据(经验),得出了某种模型(迟到的规律),并利用此模型预测未来(是否迟到)的一种方法.目前机器学习广泛应用于广告投放.趋势预测.图像识别.语音识别.自动驾驶和产品推荐等众多领域. 在确定了问题模型之后,根据已知数据寻找模型参数的过程就是训练,训练过程就是不断依据训练数据来调整参数的迭代,从而使依据模型作出的预测结果更加准确. HPC的基本概念 HPC就是高性能计算或高性能计算集群的简写.为了追求高性能,HPC的工作负载一般直接运行在Linux系

DIV 内容垂直居中

虽然Div布局已经基本上取代了表格布局,但表格布局和Div布局仍然各有千秋,互有长处.比如表格布局中的垂直居中就是Div布局的一大弱项,不过好在千变万化的CSS可以灵活运用,可以制作出准垂直居中效果,勉强过关. 要让div中的内容垂直居中,无非有以下几种方法,等我一一列举: 一.行高(line-height)法如果要垂直居中的只有一行或几个文字,那它的制作最为简单,只要让文字的行高和容器的高度相同即可,比如: p { height:30px; line-height:30px; width:10

[转]如何让div中的内容垂直居中

转自:http://blog.163.com/yan_1990/blog/static/197805107201211311515454/ 虽然Div布局已经基本上取代了表格布局,但表格布局和Div布局仍然各有千秋,互有长处.比如表格布局中的垂直居中就是Div布局的一大弱项,不过好在千变万化的CSS可以灵活运用,可以制作出准垂直居中效果,勉强过关. 要让div中的内容垂直居中,无非有以下几种方法,等我一一列举: 一.行高(line-height)法如果要垂直居中的只有一行或几个文字,那它的制作最

Bresenham算法画填充圆及SDL代码实现

画圆是计算机图形操作中一个非常重要的需求.普通的画圆算法需要大量的浮点数参与运算,而众所周知,浮点数的运算速度远低于整形数.而最终屏幕上影射的像素的坐标均为整形,不可能是连续的线,所以浮点数运算其实纯属浪费.下面介绍的Bresenham算法就是根据上文的原理设计.该算法原应用于直线的绘制,但由于圆的八分对称性,该算法也适用与圆(曲线图形)的绘制. 该算法主要是这样的原理:找出一个1/8的圆弧,用快速的增量计算找出下一个点.同时利用圆的八分对称性,找出8个点(包括该点),进行绘制. 这里给出示例的

Python下探究随机数的产生方法

资源下载 #本文PDF版下载 Python下探究随机数的产生方法(或者单击我博客园右上角的github小标,找到lab102的W7目录下即可) #本文代码下载 几种随机数算法集合(和下文出现过的相同) 前言 我们对于随机数肯定不会陌生,随机数早已成为了我们经常要用到的一个方法,比如用于密码加密,数据生成,蒙特卡洛算法等等都需要随机数的参与.那么我们的电脑是怎么才能够产生随机数的呢?是电脑自己的物理存在还是依靠算法?它到底是如何工作的呢?所以我也对这些问题有着好奇心,所以找到了许多资料学习了一下,