rand函数

随机数是骗人的,.Net、Java、C为我作证(转)

匿名 (未验证) 提交于 2019-12-02 21:52:03
原文链接: http://www.cnblogs.com/CielWater/p/3982076.html 几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数。比如在.Net中编写下面的代码: Random rand = newRandom(); Console.WriteLine(rand.Next()); 运行后结果如下: Next()方法用来返回一个随机数。同样的代码你执行和我的结果很可能不一样,而且我多次运行的结果也很可能不一样,这就是随机数。 一、陷阱 看似很简单的东西,使用的时候有陷阱。我编写下面的代码想生成100个随机数: for(int i=0;i<100;i++) { Random rand = new Random(); Console.WriteLine(rand.Next()); } 太奇怪了,竟然生成的"随机数"有好多连续一样的,这算什么"随机数"呀。有人指点"把new Random()"放到for循环外面就可以了: Random rand = newRandom(); for(int i=0;i<100;i++) { Console.WriteLine(rand.Next()); } 运行结果: 确实可以了! 二、这是为什么呢? 这要从计算机中"随机数"产生的原理说起了。我们知道

srand()与rand()的应用

孤街浪徒 提交于 2019-12-02 03:17:51
1 #include<stdio.h> 2 #include<time.h> 3 #include<stdlib.h> 4 void bubbleSort(int arr[],int arrSize){ 5 int tmp = 0; 6 int swap = 1; 7 while(swap){ 8 swap = 0; 9 for(int i = 0;i < (arrSize -1);i++){ 10 if(arr[i] > arr[i + 1]){ 11 tmp = arr[i]; 12 arr[i] = arr[i + 1]; 13 arr[i + 1] = tmp; 14 swap = 1; 15 } 16 } 17 } 18 19 return; 20 } 21 22 void outArr(char* name, char* time,int arr[],int arrSize){ 23 printf("%s %s is: \n",name,time); 24 for(int i = 0;i < arrSize;i++){ 25 printf("%d\t",arr[i]); 26 } 27 printf("\n"); 28 return; 29 } 30 31 32 void insertSort(int arr[],int arrSize){ 33 for(int i =

模拟退火

偶尔善良 提交于 2019-11-30 18:35:48
一、什么是模拟退火算法 1、爬山算法 在了解模拟退火算法之前,先来看一下爬山算法:爬山算法是一种贪心算法,该算法每次从当前的解空间中选取一个解作为最优解,直到达到一个局部最优解。假设函数f(x)的图像如下图: 现在使用爬山算法来求f(x)的最大值,若C为当前最优解,则爬山算法搜索到A就会停止搜索,这会获得一个局部最优解,而不是全局最优解。 模拟退火:继续考虑寻找f(x)最大值的问题,爬山算法搜索到A点时就会停止搜索,原因是A点左右的值均小于A点的值。模拟退火算法采用的解决办法是以一定的概率选择A两边的点,尽管A两边的点并不是局部最优解,这样就有一定的概率搜索到D点,从而搜索到B点,最终获得了全局最优解。 2、模拟退火算法 现在想求函数的(全局)最优解。如果采用Greedy策略,那么从A点开始试探,如果函数值继续减少,那么试探过程就会继续。而当到达点B时,显然我们的探求过程就结束了(因为无论朝哪个方向努力,结果只会越来越大)。最终我们只能找打一个局部最后解B。 模拟退火其实也是一种Greedy算法,但是它的搜索过程引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。以上图为例,模拟退火算法在搜索到局部最优解B后,会以一定的概率接受向右继续移动。也许经过几次这样的不是局部最优的移动后会到达B 和C之间的峰点

9.24动手动脑

前提是你 提交于 2019-11-30 16:42:10
请看以下代码,你发现了有什么特殊之处吗? 这段代码定义了重载函数,所以两个输出里面的函数名一样,但运行的结果不一样。 编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数。 Modulus=231-1=int.MaxValue Multiplier=75=16807 C=0 当显示过231-2个数之后,才可能重复。 public class suiji { private static final int N = 200; private static final int LEFT = 40; private static final int RIGHT = 10000; private static long x0 = 1L; private long a = 1103515245L; private long c = 12345L; private long m = 2147483648L; // 产生随机数 private long rand ( long r ) { // a,c,m为常数 r = ( r * a + c ) % m;//Xn+1=(aXn + c)mod m return r; } * 表示a~b之间的一个随机数 private long little ( int a, int b, long rand ) { return a + rand

[原创]Matlab 生成随机数

∥☆過路亽.° 提交于 2019-11-29 04:56:14
Matlab 中有着丰富的随机数生成函数以应用于不同的情景,我一般使用生成随机的 1~N 的整数,但是之前了解的只有 rand 函数,其生成主要为 0 ~ 1 之间的随机数,但是和所预想的有差异。在此进行进行了help 指令,之后了解到了 randi 函数,并初步学会使用,在此做一个记录。 rand 函数 rand 函数是生产 0 ~ 1 的随机数,rand(N) 为生产一个 N 行 N 列的随机数矩阵,rand(M, N) 为生成一个 M 行 N 列的随机数矩阵。以下为一些示例。 >> rand(3) ans = 0.8147 0.9134 0.2785 0.9058 0.6324 0.5469 0.1270 0.0975 0.9575 >> rand(2, 3) ans = 0.9649 0.9706 0.4854 0.1576 0.9572 0.8003 在 help rand 后,我们可以观察其解释说明。 >> help rand rand Uniformly distributed pseudorandom numbers. R = rand(N) returns an N-by-N matrix containing pseudorandom values drawn from the standard uniform distribution on the open

模拟退火算法分析

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-28 22:21:44
W1:什么是模拟退火算法? 模拟退火算法(Simulate Anneal,SA)是一种通用概率演算法,用来在一个大的搜寻空间内 找寻命题的最优解 。其原理和金属退火的原理近似。将热力学的理论套用到统计学上,金属在加热至高温后维持该温度,并以一种稳定的速度降温,最后使整个系统达到最稳定状态。 而模拟退火算法则是在求解过程中模拟了这一退火过程,即在求解过程中引入随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。 W2:为什么要了解模拟退火算法? 模拟退火算法可以尽可能的求出全局最优解,其与登山算法的优势在于加入了随机因素,当获得的值并不是最优的时候将有一定的概率接受这个值,从而有可能跳出当前的局部最优,获得全局最优解。而随着温度的降低,该概率也会相应减少。 粒子在温度T时趋于平衡的概率为exp(-ΔE/(kT)) 在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为:P(dE) = exp( dE/(kT) )。其中k是一个常数,exp表示自然指数,且dE<0。所以P和T正相关。这条公式就表示:温度越高,出现一次能量差为dE的降温的概率就越大;温度越低,则出现降温的概率就越小。又由于dE总是小于0(因为退火的过程是温度逐渐下降的过程),因此dE/kT < 0 ,所以P(dE)的函数取值范围是(0,1)

Matlab中Rand()函数用法

拟墨画扇 提交于 2019-11-28 18:28:44
一、理论准备 matlab函数randn:产生均值为0,方差 σ^2 = 1,标准差σ = 1的正态分布的随机数或矩阵的函数。 用法:Y = randn(n),返回一个n*n的随机项的矩阵。如果n不是个数量,将返回错误信息。 Y = randn(m,n) 或 Y = randn([m n]), 返回一个m*n的随机项矩阵。 Y = randn(m,n,p,...) 或 Y = randn([m n p...]), 产生随机数组(感觉就是三维数组,请看如下例子)。 1: >> rand(1,2,3) 2: ans(:,:,1) = 3: 0.445586200710899 0.646313010111265 4: ans(:,:,2) = 5: 0.709364830858073 0.754686681982361 6: ans(:,:,3) = 7: 0.276025076998578 0.679702676853675 Y = randn(size(A)), 返回一个和A有同样维数大小的随机数组。 randn s = randn('state'),估计和C++里初始化随机种子一个意思,随便了。 二、举例分析 产生一个随机分布的指定均值和方差的矩阵:将randn产生的结果乘以标准差,然后加上期望均值即可。例如,产生均值为0.6,方差为0.1的一个5*5的随机数方式如下: 1: x

mysql的floor()报错注入方法详细分析

纵然是瞬间 提交于 2019-11-27 13:37:34
刚开始学习sql注入,遇见了 select count(*) from table group by floor(rand(0)*2); 这么条语句。本着刚开始学习一定要弄明白的态度,在此做个总结。 (更好的阅读体验可访问 这里 ) 首先,只要该语句明白了,那么类似 select count(*),(floor(rand(0)*2))x from table group by x; 这样的变形语句基本上都可以变通(这里只是起了个别名)。 基本的查询 select 不必多说,剩下的几个关键字有 count 、group by 、floor、rand。 几个关键函数的说明 rand(0)*2 rand() 可以产生一个在0和1之间的随机数。 可见,每次产生的都不一样。当我们提供一个种子参数 0 后,再次查看: 可以发现,每次产生的值都是一样的。也可以称之为伪随机(产生的数据都是可预知的)。 查看多个数据看一下。( test 是我之前创建的一个拥有9条数据的表) 发现第一条数据与刚才查看的单个数据相符合,其它的数据也完全一样。 为什么要乘以 2 呢?这就要配合 floor 函数来说了。 floor(rand(0)*2) floor() 返回小于等于该值的最大整数。 之前我们了解到,rand() 是返回 0 到 1 之间的随机数,那么乘 2 后自然是返回 0 到 2 之间的随机数,再配合

Netlab -Chap8 抽样(2)基本抽样

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-27 06:38:31
要想有效利用蒙特卡罗积分,需要能从不同概率密度函数中抽样。这里讨论几个适用于低维分布的抽样方法。 1.随机数生成器 大部分实际的随机数生成器基于下面的线性同余算法(a linear congruential algorithm) , 其中a,c,n都是正整数 它生成的正整数 的值域为[1,n)。如果将其处以n,那么就得到(0,1)范围上的均匀分布。如果a,c,n值选择合适的话,这个生成器的周期(直到重复前所生成数值的个数)是n。 由于其计算速度快,编程简单,这个算法非常流行。它的缺点是连续调用时生成随机数是序列相关的。如果某一时间,k个随机数用作超立方体 中的点,那么它们往往位于 位的超平面上。 该算法生成的数值完全由第一个值 决定,因此 被称为“种子(seed)” Netlab函数为 rand 特点 1)周期为 ,足够蒙特卡罗积分用 2)它没有种子,而是有一个状态向量(35个分量),可以存储并重用 使用 a = rand(1000,10); %生成1000*10的随机矩阵 s = rand('state');%保存35维的状态向量 rand(‘state’, s);%重置状态 b = rand(1000,10);%此时状态向量相同,因此a=b rand(‘state’, n);%n为正整数,将生成器当前状态设为第n个状态 2.变换为其它分布

PHP实现随机生成验证码功能

好久不见. 提交于 2019-11-26 19:34:31
验证码在表单实现越来越多了,但是用js的写的验证码,总觉得不方便,所以学习了下php实现的验证码 验证码在表单实现越来越多了,但是用js的写的验证码,总觉得不方便,所以学习了下php实现的验证码。当然,也可以封装成一个函数,以后使用的时候也是很方便的,但是现在未封装。本人菜鸟一只,大佬勿喷,也希望得到大佬的意见 现在说说简单的数字验证吧 建议各位按照代码注释一步一步来,改少的分号不能少。 新建一个cap_sz.php文件: <?php session_start(); //设置session,一定要在顶部 $width = 150; //设置图片宽为300像素 $height = 40; //设置图片高为40像素 $image = imagecreatetruecolor($width, $height); //设置验证码大小的函数 $bgcolor = imagecolorallocate($image, 255, 255, 255); //验证码颜色RGB为(255,255,255)#ffffff imagefill($image, 0, 0, $bgcolor); //区域填充 $cap_code = ""; for($i=0;$i<4;$i++){ $fontsize = 7; //设置字体大小 $fontcolor = imagecolorallocate($image,