种子算法
A. 随机种子的方法
一般种子可以以当前的系统时间,这是完全随机的
算法1:平方取中法。
1)将种子设为X0,并mod 10000得到4位数
2)将它平方得到一个8位数(不足8位时前面补0)
3)取中间的4位数可得到下一个4位随机数X1
4)重复1-3步,即可产生多个随机数
这个算法的一个主要缺点是最终它会退化成0,不能继续产生随机数。
算法2:线性同余法
1)将种子设为X0,
2)用一个算法X(n+1)=(a*X(n)+b) mod c产生X(n+1)
一般将c取得很大,可产生0到c-1之间的伪随机数
该算法的一个缺点是会出现循环。
在windows平台下,可以考虑将如下参数作为影响种子的因素。
⒈GetTickCount()
系统启动以来的嘀嗒时间
说明:该时间与系统运行时长相关,
⒉GetCurrentProcessId()
当前进程Id号
说明:该Id与系统启动进程数量及次序有关,一般波动范围较小。
⒊GetCurrentProcess()
当前进程句柄
说明:该句柄实质就是内存地址,但每次进程启动时地址值是不确定的。
⒋GetProcessTimes()
进程时间参数
说明:-
⒌GetCurrentThreadId()
当前线程Id号
⒍GetCurrentThread()
当前线程句柄
⒎GetThreadTimes()
线程时间参数
⒏GetCurrentHwProfile()
Profile配置文件
⒐GetSysColor()
系统Color
⒑GetSystemInfo()
系统信息
⒒GetSystemPowerStatus()
电源状态
⒓GetKeyboardState()
键盘状态
⒔GlobalMemoryStatus()
内存状态
⒕time()
当前时间 秒
⒖GUID
各硬件设备GUID
⒗MAC
网卡mac
⒘CPUID
CPU Id号
⒙声卡录音噪音
该参量与环境相关
⒚用户键盘间隔时间
该参量与用户习惯相关
其次,尽最大可能增加这些因素的维度。这里说的维度是指
种子结果与因素之间的关联程度。一般使用hash函数对多个
因素进行哈希运算。这样得到的种子具有较强的散列特性。
通过以上技术手段得到的种子产生的伪随机数是具有较好
统计特性的,它不依赖于某一台机器,某一时刻,某一方法,
而是复杂多变、让人捉摸不透难于重现的。
B. 种子填充算法的时间复杂度和空间复杂度分析
从涂色的角度讲,区域内的n个点,每一个点只被涂了一次色,没有重复涂,所以可以认为时间复杂度是O(n);空间复杂度也为O(n),虽然有些点重复栈
C. 随机种子
伪随机数是以一个称为“种子”的数作为初始条件,通过固定的算法产生一个看上去像是随机产生的数字序列的。
举例来说,这个算法可以设计成类似于“将给定的种子开平方,取有效数字的第2至9位作为下一次迭代的种子,重复此过程3次后,以结果的第1-4位作为返回值、并将该结果作为下次调用本过程的种子”等等。
然而,无论这个算法如何复杂,只要它固定不变,则对于相同的种子来说,每一次从这个种子开始、第n次通过该算法取得的伪随机数却总是一样的,因此必须再通过各种真正客观的途径使得该初始的种子不同。一般来说常用的方式是以运行时候的时钟时间,经一定变化后作为初始的种子的。
D. 用队列实现种子填充算法的非递归
一、种子填充算法(Seed Filling)
如果要填充的区域是以图像元数据方式给出的,通常使用种子填充算法(Seed Filling)进行区域填充。种子填充算法需要给出图像数据的区域,以及区域内的一个点,这种算法比较适合人机交互方式进行的图像填充操作,不适合计算机自动处理和判断填色。根据对图像区域边界定义方式以及对点的颜色修改方式,种子填充又可细分为几类,比如注入填充算法(Flood Fill Algorithm)、边界填充算法(Boundary Fill Algorithm)以及为减少递归和压栈次数而改进的扫描线种子填充算法等等。
所有种子填充算法的核心其实就是一个递归算法,都是从指定的种子点开始,向各个方向上搜索,逐个像素进行处理,直到遇到边界,各种种子填充算法只是在处理颜色和边界的方式上有所不同。在开始介绍种子填充算法之前,首先也介绍两个概念,就是“4-联通算法”和“8-联通算法”。既然是搜索就涉及到搜索的方向问题,从区域内任意一点出发,如果只是通过上、下、左、右四个方向搜索到达区域内的任意像素,则用这种方法填充的区域就称为四连通域,这种填充方法就称为“4-联通算法”。如果从区域内任意一点出发,通过上、下、左、右、左上、左下、右上和右下全部八个方向到达区域内的任意像素,则这种方法填充的区域就称为八连通域,这种填充方法就称为“8-联通算法”。如图1(a)所示,假设中心的蓝色点是当前处理的点,如果是“4-联通算法”,则只搜索处理周围蓝色标识的四个点,如果是“8-联通算法”则除了处理上、下、左、右四个蓝色标识的点,还搜索处理四个红色标识的点。两种搜索算法的填充效果分别如如图1(b)和图1(c)所示,假如都是从黄色点开始填充,则“4-联通算法”如图1(b)所示只搜索填充左下角的区域,而“8-联通算法”则如图1(c)所示,将左下角和右上角的区域都填充了。
图(1) “4-联通”和“8-联通”填充效果
并不能仅仅因为图1的填充效果就认为“8-联通算法”一定比“4-联通算法”好,应该根据应用环境和实际的需求选择联通搜索方式,在很多情况下,只有“4-联通算法”才能得到正确的结果。
1.1 注入填充算法(Flood Fill Algorithm)
注入填充算法不特别强调区域的边界,它只是从指定位置开始,将所有联通区域内某种指定颜色的点都替换成另一种颜色,从而实现填充效果。注入填充算法能够实现颜色替换之类的功能,这在图像处理软件中都得到了广泛的应用。注入填充算法的实现非常简单,核心就是递归和搜索,以下就是注入填充算法的一个实现:
164 void FloodSeedFill(int x, int y, int old_color, int new_color)
165 {
166 if(GetPixelColor(x, y) == old_color)
167 {
168 SetPixelColor(x, y, new_color);
169 for(int i = 0; i < COUNT_OF(direction_8); i++)
170 {
171 FloodSeedFill(x + direction_8[i].x_offset,
172 y + direction_8[i].y_offset, old_color, new_color);
173 }
174 }
175 }
for循环实现了向8个联通方向的递归搜索,秘密就在direction_8的定义:
15 typedef struct tagDIRECTION
16 {
17 int x_offset;
18 int y_offset;
19 }DIRECTION;
79 DIRECTION direction_8[] = { {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1},{0, -1}, {-1, -1} };
这个是搜索类算法中常用的技巧,无需做太多说明,其实只要将其替换成如下direction_4的定义,就可以将算法改成4个联通方向填充算法:
80 DIRECTION direction_4[] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };
图2就是应用本算法实现的“4-联通”和“8-联通”填充效果:
E. 社交网络种子节点搜索算法有几种基本的
针对经典影响力最大化算法存在的计算时间过长等问题,提出一种新的启发式贪婪算法-高节点度贪婪算法(HD_Greedy)。基于社交网络节点的度呈幂律分布以及节点的度与影响力强关联性,在极小部分高度数节点中搜索最大影响力种子节点,使搜索空间大幅度地减少,节约了大量的盲目搜索时间,并且不损失种子节点影响力。实验结果表明,在不同信息传播模型中,HD_Greedy算法得到的种子节点影响力与其它贪婪算法接近,但计算效率有了较大提高,尤其适合于在大规模社交网络中搜索最大影响力种子节点。
F. 利用种子法,图像处理如何确定基准点矩阵
matlab 图像定位方法如下:
1由RGB空间转化到HSV空间,统计红色点;
2若红色点置1,背景色置0,闭运算连通可能区域;
3种子法获取区域个数及坐标,此时可能截取到多个拥有红色像素的区域,比如邮政编码及下面的信函位置;
4截取两个可能的区域,分别进行阈值分割二值化,根据水平方向上的跳变数或者宽高比就可以筛选出编码区域,同时可以垂直投影二值化图像,根据6个方块位置得到其中字符位置;
5使用BP神经网络训练/模板匹配等方法识别字符。
MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
G. 扫描线填充算法与种子填充算法的区别是什么
种子优点是非常简单,缺点是需要大量栈空间来存储相邻的点。
改进的方法就是:通过沿扫描线填充水平像素段,来处理四连通或八连通相邻点,这样就仅仅只需要将每个水平像素段的起始位置压入栈,而不需要将当前位置周围尚未处理的相邻像素都压入栈,从而可以节省大量的栈空间。
H. 什么是随机数及随机数种子,能不能详细通俗介绍一下
随机数就是就随机数种子中取出的数。种子就是个序号,这个序号交给一个数列管理器,通过这个序号,你从管理器中取出一个数列,这个数列就是你通过那个序号得到的随机数。
但这个随技术并不真正随机。因为它是通过某个算法的得到。也就是说你给数列管理器同一个序号将得到同样一个“随机”数列。
也就是说种子和随机数列是一一对应的。{An}=f(x), x 就是种子,F()是算法,{An}是数列,这个数列看上去是随机的,这是因为An的通项很复杂。
例如:
从1、2、3、4、5、6、7、8、9、0这十个数中随机取出一个数,取出的数是6的话,那么6就叫随机数。十个数字就叫随机数种子。
如果是从1到50之间取数字,取出的数字叫随机数,这1到50那50个数字就叫随机数种子。
(8)种子算法扩展阅读:
根据密码学原理,随机数的随机性检验可以分为三个标准:
统计学伪随机性。统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。
密码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。
真随机性。其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),可以认为用这个方法演算出来了真随机数。
相应的,随机数也分为三类:
伪随机数:满足第一个条件的随机数。
密码学安全的伪随机数:同时满足前两个条件的随机数。可以通过密码学安全伪随机数生成器计算得出。
真随机数:同时满足三个条件的随机数。