当前位置:首页 » 操作系统 » seed算法

seed算法

发布时间: 2022-04-28 10:48:56

java中random(seed)函数的算法

你这里的random是哪个类里的方法?
Math类里的random()方法是不能传参数的,返回的数的范围在0.0-1.0之间

一般随机数中提到的seed应该指的是生成随机数的基准,就是按照什么标准来生成。

② 在Python代码中random.seed(1)什么意思

seed( ) 用于指定随机数生成时所用算法开始的整数值。

如果使用相同的seed( )值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同,设置的seed()值仅一次有效。

在其他语言中,要在两个变量间交换值而不是用第三个变量,要么使用算术运算符,要么使用位异或(Bitwise XOR)。

(2)seed算法扩展阅读:

注意事项:

在Python里,一个表达式中的名字在它被赋值之前是没法使用的。这是有意而为的:这样能避免一些输入失误,同时也能避免默认究竟应该是什么类型的问题(0,None,[],?)。记住把计数器初始化为0,列表初始化为[],以此类推。

确保把顶层的,未嵌套的代码放在最左边第一列开始。这包括在模块文件中未嵌套的代码,以及在交互提示符中未嵌套的代码。Python使用缩进的办法来区分嵌套的代码段,因此在代码左边的空格意味着嵌套的代码块。除了缩进以外,空格通常是被忽略掉的。

③ C语言 time(NULL)

我们知道在产生随机数的时候,需要一个叫做种子seed的值作为产生随机数算法的初始值。
而c/c++库中的srand就是为这一次的随机数生成设置种子。s代表的就是seed的意思。
time_t
time(time_t
*time);该函数返回自计算机计时的某个时刻起到现在所过去的秒数。
一般是返回自1970年1月1日00:00:00以来,到调用函数的时刻所累积的秒数。
所以综上所述:
srand((unsigned)time(null));
这语句的含义就是以自1970年1月1日00:00:00以来,到调用函数的时刻所累积的秒数作为
产生随机数算法的种子seed。
没有语句会对程序产生什么影响:
如果在程序运行时没有自主设置种子的话,用函数rand产生的随机数序列会是一样的。
而用srand设置随机数种子后,可能产生不同的随机序列(概率很大)。
之所以说以很大的概率产生不同的随机数序列,是因为从上面的解释可以看到,
srand是以秒数为单位的。一旦程序多次运行的时间间隔少于1s。那么srand设置种子也没有什么用处。所以库函数产生随机数有一定的缺陷。不知道我解释明白了没有!

④ 用队列实现种子填充算法的非递归

一、种子填充算法(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-联通”填充效果:

⑤ 如何在重复调用一个程序时,每次给seed一个不同随机种子

建议:
你可以改成不要每次都new一个Random对象,而是使用同一个Random对象,调用多次nextDouble()方法
public class random {
public static void main(String[] args) {
GRNumber(123, 2, 32, 5);
}

public static void GRNumber(int seed, int x, int y, int times) {
Random r = new Random(seed);
for (int i=0; i<times; i++) {
double number = x + (int) (r.nextDouble()*y);
System.out.println("产生随机数: " + number);
}
}

}
Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。
你这里就是每次都使用同一个种子,new一个Random对象,获得这个对象的第一个随机数,当然每次都相同。

⑥ 随机算法、函数

产生整数rand的原理是:
y=ax+b(mod n)其中,n一般是一个很大的素数,几万。
a也是大素数。而且a,b,n都是常数。所以rand的产生决定于x,
他被称为seed。
每一个seed都是上一次产生的y的函数。这样,如果直接取seed=y的话,
虽然产生的rand之间相关性甚小,但只要知道某个y,就能推知以后的rand。
为避免这种情况,一般取seed为y和当时计算机的时间的函数,如seed=y+t

⑦ SAS语言RANNOR函数的seed

(1)首先明确一点,SAS的rannor生成的标准正态伪随机数是通过对均匀分布伪随机数(ranuni函数)做Box-Muller变换得到的。而均匀分布伪随机数是通过余同数生成器(即Lehmer迭代公式)获得的,公式如下:

其中SAS内部设置a=397204094,m=2^31-1,c=0。上述公式生成的是(0,m)上的均匀伪随机数,SAS通过除以m获得(0,1)上的均匀伪随机数。所以,由上述算法可知,seed的作用就是给出这个迭代器的初始值R0。

(2)seed值应该说跟它后面生成的随机数是对应的。至于为什么你获得的随机数是一样的,原因在于rannor函数得到一个seed后,后面生成的随机数就是根据最初seed生成的一系列伪随机数。这个通过比较下面程序的结果就明白了:

data test;
do x=1234567,123456,12345,0;
rannor=rannor(x);
output;
end;
run;
data test2;
do i=1 to 4;
rannor=rannor(1234567);
output;
end;
run;
proc print data=test;
run;
proc print data=test2;
run;

热点内容
hibernate存储blob 发布:2024-10-04 13:16:22 浏览:961
ppsspp安卓文件夹 发布:2024-10-04 13:02:11 浏览:586
android多listview 发布:2024-10-04 13:02:07 浏览:10
isp会限制ftp吗 发布:2024-10-04 13:02:04 浏览:97
20兆电信光纤上传速度 发布:2024-10-04 12:44:34 浏览:718
重命名文件夹linux 发布:2024-10-04 12:44:25 浏览:615
怎样在qq发送文件夹 发布:2024-10-04 12:44:25 浏览:359
加密狗发票 发布:2024-10-04 12:37:53 浏览:431
安卓手机怎么看应用数 发布:2024-10-04 12:30:34 浏览:153
windows7反编译 发布:2024-10-04 12:25:50 浏览:637