当前位置:文档之家› Java随机数总结

Java随机数总结

Java随机数总结
Java随机数总结

随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串、数字。或者随即生成一个不定长度的数字、或者进行一个模拟的随机选择等等。Java提供了最基本的工具,可以帮

关键字:Java随机数总结随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串、数字。或者随即生成一个不定长度的数字、或者进行一个模拟的随机选择等等。Java提供了最基本的工具,可以帮助开发者来实现这一切。

一、Java随机数的产生方式

在Java中,随机数的概念从广义上将,有三种。

1、通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。

2、通过Math.random()返回一个0到1之间的double值。

3、通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。

二、Random类API说明

1、Java API说明

Random类的实例用于生成伪随机数流。此类使用 48 位的种子,使用线性同余公式对其进行修改(请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 节)。

如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证属性的实现,为类 Random 指定了特定的算法。

很多应用程序会发现 Math 类中的 random 方法更易于使用。

2、方法摘要

Random()

创建一个新的随机数生成器。

Random(long seed)

使用单个 long 种子创建一个新随机数生成器: public Random(long seed) { setSeed(seed); } next 方法使用它来保存随机数生成器的状态。

protected int next(int bits)

生成下一个伪随机数。

boolean nextBoolean()

返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 boolean 值。

void nextBytes(byte[] bytes)

生成随机字节并将其置于用户提供的字节数组中。

double nextDouble()

返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.0 和 1.0之间均匀分布的 double 值。

float nextFloat()

返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.0 和 1.0 之间均匀分布的 float 值。

double nextGaussian()

返回下一个伪随机数,它是从此随机数生成器的序列中取出的、呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,标准偏差是 1.0。

int nextInt()

返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。

int nextInt(int n)

返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。

long nextLong()

返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 long 值。

void setSeed(long seed)

使用单个 long 种子设置此随机数生成器的种子。

三、Random类使用说明

1、带种子与不带种子的区别

Random类使用的根本是策略分带种子和不带种子的Random的实例。

通俗说,两者的区别是:

带种子的,每次运行生成的结果都是一样的。

不带种子的,每次运行生成的都是随机的,没有规律可言。

2、创建不带种子的Random对象

Random random = new Random();

3、创建不带种子的Random对象

有两种方法:

1) Random random = new Random(555L);

2) Random random = new Random();

random.setSeed(555L);

四、测试

通过一个例子说明上面的用法

import java.util.Random;

/**

* Java随机数测试

* User: leizhimin

* Date: 2008-11-19 17:52:50

*/

public class TestRandomNum {

public static void main(String[] args) {

randomTest();

testNoSeed();

testSeed1();

testSeed2();

}

public static void randomTest() {

System.out.println("--------------test()--------------");

//返回以毫秒为单位的当前时间。

long r1 = System.currentTimeMillis();

//返回带正号的 double 值,大于或等于 0.0,小于 1.0。

double r2 = Math.random();

//通过Random类来获取下一个随机的整数

int r3 = new Random().nextInt();

System.out.println("r1 = " + r1);

System.out.println("r3 = " + r2);

System.out.println("r2 = " + r3);

}

public static void testNoSeed() {

System.out.println("--------------testNoSeed()--------------"); //创建不带种子的测试Random对象

Random random = new Random();

for (int i = 0; i < 3; i++) {

System.out.println(random.nextInt());

}

}

public static void testSeed1() {

System.out.println("--------------testSeed1()--------------"); //创建带种子的测试Random对象

Random random = new Random(555L);

for (int i = 0; i < 3; i++) {

System.out.println(random.nextInt());

}

}

public static void testSeed2() {

System.out.println("--------------testSeed2()--------------"); //创建带种子的测试Random对象

Random random = new Random();

random.setSeed(555L);

for (int i = 0; i < 3; i++) {

System.out.println(random.nextInt());

}

}

}

运行结果:

--------------test()--------------

r1 = 1227108626582

r3 = 0.5324887850155043

r2 = -368083737

--------------testNoSeed()--------------

809503475

1585541532

-645134204

--------------testSeed1()--------------

-1367481220

292886146

-1462441651

--------------testSeed2()--------------

-1367481220

292886146

-1462441651

Process finished with exit code 0 通过testSeed1()与testSeed2()方法的结果可以看到,两个打印结果相同,因为他们种子相同,再运行一次,结果还是一样的,这就是带种子随机数的特性。

而不带种子的,每次运行结果都是随机的。

五、综合应用

下面通过最近写的一个随机数工具类来展示用法:

import java.util.Random;

/**

* 随机数、随即字符串工具

* User: leizhimin

* Date: 2008-11-19 9:43:09

*/

public class RandomUtils {

public static final String allChar =

"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

public static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

public static final String numberChar = "0123456789";

/**

* 返回一个定长的随机字符串(只包含大小写字母、数字)

*

* @param length 随机字符串长度

* @return 随机字符串

*/

public static String generateString(int length) {

StringBuffer sb = new StringBuffer();

Random random = new Random();

for (int i = 0; i < length; i++) {

sb.append(allChar.charAt(random.nextInt(allChar.length())));

}

return sb.toString();

}

/**

* 返回一个定长的随机纯字母字符串(只包含大小写字母)

*

* @param length 随机字符串长度

* @return 随机字符串

*/

public static String generateMixString(int length) { StringBuffer sb = new StringBuffer();

Random random = new Random();

for (int i = 0; i < length; i++) {

sb.append(allChar.charAt(random.nextInt(letterChar.length()))); }

return sb.toString();

/**

* 返回一个定长的随机纯大写字母字符串(只包含大小写字母) *

* @param length 随机字符串长度

* @return 随机字符串

*/

public static String generateLowerString(int length) { return generateMixString(length).toLowerCase();

}

/**

* 返回一个定长的随机纯小写字母字符串(只包含大小写字母) *

* @param length 随机字符串长度

* @return 随机字符串

*/

public static String generateUpperString(int length) { return generateMixString(length).toUpperCase();

}

/**

* 生成一个定长的纯0字符串

*

* @param length 字符串长度

* @return 纯0字符串

public static String generateZeroString(int length) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < length; i++) {

sb.append('0');

}

return sb.toString();

}

/**

* 根据数字生成一个定长的字符串,长度不够前面补0

*

* @param num 数字

* @param fixdlenth 字符串长度

* @return 定长的字符串

*/

public static String toFixdLengthString(long num, int fixdlenth) {

StringBuffer sb = new StringBuffer();

String strNum = String.valueOf(num);

if (fixdlenth - strNum.length() >= 0) {

sb.append(generateZeroString(fixdlenth - strNum.length()));

} else {

throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常!");

}

sb.append(strNum);

return sb.toString();

}

/**

* 根据数字生成一个定长的字符串,长度不够前面补0

*

* @param num 数字

* @param fixdlenth 字符串长度

* @return 定长的字符串

*/

public static String toFixdLengthString(int num, int fixdlenth) {

StringBuffer sb = new StringBuffer();

String strNum = String.valueOf(num);

if (fixdlenth - strNum.length() >= 0) {

sb.append(generateZeroString(fixdlenth - strNum.length()));

} else {

throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常!");

}

sb.append(strNum);

return sb.toString();

}

public static void main(String[] args) {

System.out.println(generateString(15));

System.out.println(generateMixString(15));

System.out.println(generateLowerString(15));

System.out.println(generateUpperString(15));

System.out.println(generateZeroString(15));

System.out.println(toFixdLengthString(123, 15));

System.out.println(toFixdLengthString(123L, 15));

}

}

运行结果:

vWMBPiNbzfGCpHG

23hyraHdJkKPwMv

tigowetbwkm1nde

BPZ1KNEJPHB115N

000000000000000

000000000000123

000000000000123

Process finished with exit code 0

六、总结

1、随机数很常用,在Java有三种产生方式,以Random随机数的使用最为复杂。

2、Random类对象有是否带种子之分,带种子的只要种子相同,多次运行,生成随机数的结果总是那样。

3、带种子随机数的带种子的对象创建方式有两种,效果一样。但是带种子的随机数用处似乎不大。

4、Random的功能涵盖了Math.random()的功能。

5、可以通过随机数去做实现随机字符串等复杂的随机数据。

6、不要研究不重复的随机数,意义不大。

正态分布随机数生成算法

概率论与数理统计课程设计 题目:正态分布随机数生成算法 要编程得到服从均匀分布的伪随机数是容易的。C语言、Java语言等都提供了相应的函

数。但是要想生成服从正态分布的随机数就没那么容易了。 得到服从正态分布的随机数的基本思想是先得到服从均匀分布的随机数,再将服从均匀分布的随机数转变为服从正态分布。接下来就先分析三个从均匀分布到正态分布转变的方法。然后编程实现其中的两个方法并对程序实现运作的效果进行统计分析。 1、 方法分析 (1) 利用分布函数的反函数 若要得到分布函数为F(x)的随机变量Y 。 可令1()Y F u -=, 其中u 是服从均匀分布的随机变量,有 1 ()(())() P Y y P U F y F y -≤=≤= 因而,对于任意的分布函数,只要求出它的反函数,就可以由服从均匀分布的随机变量实例来生成服从该分布函数的随机变量实例。 现在来看正态分布的分布函数,对于2 ~(,)X N μσ,其分布函数为: 2 2()21 ()t x F x e μσ ---∞ = ? 显然,要想求其反函数是相当困难的,同时要想编程实现也很复杂。可见,用此种方法来生成服从正态分布的随机变量实例并不可取。 (2) 利用中心极限定理 第二种方法利用林德伯格—莱维(Lindeberg —Levi)中心极限定理:如果随机变量序列 12,,,,n X X X 独立同分布,并且具有有限的数学期望和方差 ()()2 ,0(1,2,),i i E X D X i μσ ==>= 则对一切x R ∈有 2 2 1lim t n x i n i P X n x dt μ- -∞ →∞ =? ?? -≤= ????? ∑? 因此,对于服从均匀分布的随机变量i X ,只要n 充分大, 11 n i i X n μ=? -? ?∑就服从()0,1N 。我们将实现这一方法。 (3) 使用Box Muller 方法 先证明2 2 2x e dx π-∞-∞ =? : 令2 2 x I e dx -∞-∞ = ? ,则

C语言中产生随机数的方法

C语言中产生随机数的方法 引例:产生10个[100-200]区间内的随机整数。 #include #include //rand函数的头文件 #include //时间函数的头文件 int main() { int i; //循环变量 srand((unsigned) time(NULL)); //产生随机数的起始数据(以时间为种子) for (i=0; i<10; i++) //printf("%d\n", rand()); //产生[0,0x7fff)即[0,32767)以内的随机整数 //printf("%d\n", rand()%100); //产生0-99的随机整数 printf("%d\n", rand()%(200-100+1) + 100); //产生[100,200]内的随机整数return 0; } 在C语言中产生随机数需要以下几个函数的配合使用。 (1)rand函数——产生伪随机数 原型:int rand(void) 头文件:stdlib.h 功能:产生从0到RAND_MAX之间的随机数。RAND_MAX的值通常是0x7fff(十六进制数7FFF,也就是十进制数32767)。 例: #include #include int main() { int k; k = rand(); printf("%d\n", k); return 0; } 编译运行,发现每次运行程序产生的随机数都是一样的。 计算机中产生随机数,实际是采用一个固定的数作为“种子”,在一个给定的复杂算法中计算结果,所以叫“伪随机数”。 C语言中由于采用固定的序列作为种子,所以每次执行所取的是同一个数。 为上面的例子增加一个循环结构: #include #include int main() { int k,i;

各种分布的随机数生成算法

各型分布随机数的产生算法 随机序列主要用概率密度函数(PDF〃Probability Density Function)来描述。 一、均匀分布U(a,b) ?1x∈[a,b]? PDF为f(x)=?b?a?0〃其他? 生成算法:x=a+(b?a)u〃式中u为[0,1]区间均匀分布的随机数(下同)。 二、指数分布e(β) x?1?exp(?x∈[0,∞)βPDF为f(x)=?β ?0〃其他? 生成算法:x=?βln(1?u)或x=?βln(u)。由于(1?u)与u同为[0,1]均匀分布〃所以可用u 替换(1?u)。下面凡涉及到(1?u)的地方均可用u替换。 三、瑞利分布R(μ) ?xx2 exp[?x≥0?回波振幅的PDF为f(x)=?μ2 2μ2 ?0〃其他? 生成算法:x=?2μ2ln(1?u)。 四、韦布尔分布Weibull(α,β) xα??αα?1?αβxexp[?(]x∈(0,∞)βPDF为f(x)=? ?0〃其他? 生成算法:x=β[?ln(1?u)]1/α 五、高斯(正态)分布N(μ,σ2) ?1(x?μ)2 exp[?]x∈?2PDF为f(x)=?2πσ 2σ ?0〃其他? 生成算法: 1?y=?2lnu1sin(2πu2)生成标准正态分布N(0,1)〃式中u1和u2是相互独立的[0,1]区间

均匀分布的随机序列。 2?x=μ+σy产生N(μ,σ2)分布随机序列。 六、对数正态分布Ln(μ,σ2) ?1(lnx?μ)2 exp[?x>0PDF为f(x)=?2πσx 2σ2 ?0〃其他? 生成算法: 1?产生高斯随机序列y=N(μ,σ2)。 2?由于y=g(x)=lnx〃所以x=g?1(y)=exp(y)。 七、斯威林(Swerling)分布 7.1 SwerlingⅠ、Ⅱ型 7.1.1 截面积起伏 σ?1?exp[σ≥0?σ0截面积的PDF为f(σ)=?σ0〃【指数分布e(σ0)】 ?0〃其他? 生成算法:σ=?σ0ln(1?u)。 7.1.2 回波振幅起伏 ?AA2 ?exp[?2]A≥0〃式中A2=σ〃2A02=σ0。回波振幅的PDF为f(A)=?A02【瑞利分布R(A0)】2A0?0〃其他? 生成算法:A=?2A02ln(1?u)=σ0ln(1?u)。也可由A2=σ得A==?0ln(1?u) 7.2 SwerlingⅢ、Ⅳ型 7.2.1 截面积起伏 2σ?4σ]σ≥0?2exp[?σσ截面积的PDF为f(σ)=?0〃 0?0〃其他? 生成算法:σ=?式中u1和u2是相互独立的[0,1]区间均匀分布随机序列。 [ln(1?u1)+ln(1?u2)]〃2

正态分布随机数

数学模型: 设连续型随机变量X 的高斯分布的概率密度为 ( )22 ()2,x f x μσ-= -∞<x <+∞ (3-1) 其中μ,σ(σ>0)为常数,则称X 服从参数为μ,σ的正态分布或高斯(Gauss)分布,记为X ~N (μ,2σ)。均值和方差的计算见公式3-2和公式3-3所示,可得到正态分布随机变量X 的均值E(X)=μ和方差D(X)=2σ。 ()()E X xf x dx +∞ -∞ =? (3-2) 2()()D X x f x dx +∞ -∞ =? (3-3) ()()E X xf x dx +∞ -∞ =? 22 ()2x dx μσ-- +∞ -∞ =? 令 x t μ σ -=,则 2 2()()t E X t dt σμσ+∞ --∞ =+?? 2 2 22t t dt dt σ μ+∞ +∞---∞ -∞ =+?? ? 0μμ=+= 根据方差的定义可知: 2 (){[()]} D X E X E X =- 所以,2 (){[()]}D X E X E X =- 2()22()x x dt μσμ-- +∞ -∞ = -? 2222 t t dt σσ+∞ --∞ =?? 2 22 2t t dt σ+∞ --∞ =?

2 σ= 即知正态分布的两个参数分别是该分布的数学期望和方差。 中心极限定理: 设随机变量12,,,n X X X ???相互独立,服从同一分布,且具有相同的均值和方差:()k E X μ=,2()0(1,2,,)k D X k n σ=≠=???,则随机变量 () n n n k k k n X E X X n Y μ --= = ∑∑∑ (3-4) 的分布函数()n F x 对于任意x 都满足 2 2 lim ()lim }n t k x n n n X n F x P x dt μ →∞ →∞ -=≤=∑? (3-5) 即当n 趋向于无穷大时,随机变量n Y 近似的服从标准正态分布N(0,l)。在实际应用中当。大于等于30时,可以把1n i i Y X ==∑当作服从均值为n μ,方差为n 2σ的 正态分布,那么变量'Y = 近似服从标准正态分布N ~(0,l)。 Box-Muller 变换法: 变换法是通过一个变换将一个分布的随机数变换成一个不同分布的随机数。高斯分布的密度函数见公式3-1所示,通过Box-Muller 变换,它可以产生精确的正态分布的随机变量。其变换式如下 : 1)y v π (3-6) 2)y v π (3-7) 式中u ,v 是在区间[0,1]上服从均匀分布,且相互独立的随机变量,所以得到的随机变量1y ,2y 也应该是相互独立的,且服从N ~(0,1)的标准正态分布。 Box-Muller 变换的推导过程如下: 由公式3-6和公式3-7可得: 221212 2 1 ,()2y y y u e v arctg y π+- == (3-8)

正态分布随机数的产生

四院四队 正态分布随机数的产生 实验报告 2014年5月26日

正态分布随机数的产生 一、 实验简述 通过matlab 实现正态分布N(0,1)随机数的产生。 二、 历史背景 正态分布是最重要的一种概率分布。正态分布概念是由德国的数学家和天文学家Moivre 于1733年首次提出的,但由于德国数学家Gauss 率先将其应用于天文学家研究,故正态分布又叫高斯分布,高斯这项工作对后世的影响极大,他使正态分布同时有了“高斯分布”的名称,后世之所以多将最小二乘法的发明权归之于他,也是出于这一工作。高斯是一个伟大的数学家,重要的贡献不胜枚举。但现今德国10马克的印有高斯头像的钞票,其上还印有正态分布的密度曲线。这传达了一种想法:在高斯的一切科学贡献中,其对人类文明影响最大者,就是这一项。在高斯刚作出这个发现之初,也许人们还只能从其理论的简化上来评价其优越性,其全部影响还不能充分看出来。这要到20世纪正态小样本理论充分发展起来以后。拉普拉斯很快得知高斯的工作,并马上将其与他发现的中心极限定理联系起来,为此,他在即将发表的一篇文章(发表于1810年)上加上了一点补充,指出如若误差可看成许多量的叠加,根据他的中心极限定理,误差理应有高斯分布。这是历史上第一次提到所谓“元误差学说”——误差是由大量的、由种种原因产生的元误差叠加而成。后来到1837年,海根(G.Hagen )在一篇论文中正式提出了这个学说。 其实,他提出的形式有相当大的局限性:海根把误差设想成个数很多的、独立同分布的“元误差” 之和,每只取两值,其概率都是1/2,由此出发,按狄莫佛的中心极限定理,立即就得出误差(近似地)服从正态分布。拉普拉斯所指出的这一点有重大的意义,在于他给误差的正态理论一个更自然合理、更令人信服的解释。因为,高斯的说法有一点循环论证的气味:由于算术平均是优良的,推出误差必须服从正态分布;反过来,由后一结论又推出算术平均及最小二乘估计的优良性,故必须认定这二者之一(算术平均的优良性,误差的正态性) 为出发点。但算术平均到底并没有自行成立的理由,以它作为理论中一个预设的出发点,终觉有其不足之处。拉普拉斯的理论把这断裂的一环连接起来,使之成为一个和谐的整体,实有着极重大的意义。 三、 实验步骤 设U 1,U 2相互独立同服从U(0,1),令 1 2 112(2lnU )cos(2U )X π=-

一维正态分布随机数序列的产生方法

一维正态分布随机数序列的产生方法 一、文献综述 1.随机数的定义及产生方法 1).随机数的定义及性质 在连续型随机变量的分布中,最简单而且最基本的分布是单位均匀分布。由该分布抽取的简单子样称,随机数序列,其中每一个体称为随机数。 单位均匀分布也称为[0,1]上的均匀分布。 由于随机数在蒙特卡罗方法中占有极其重要的位置,我们用专门的符号ξ表示。由随机数序列的定义可知,ξ1,ξ2,…是相互独立且具有相同单位均匀分布的随机数序列。也就是说,独立性、均匀性是随机数必备的两个特点。 随机数具有非常重要的性质:对于任意自然数s,由s个随机数组成的 s维空间上的点(ξn+1,ξn+2,…ξn+s)在s维空间的单位立方体Gs上 均匀分布,即对任意的ai,如下等式成立: 其中P(·)表示事件·发生的概率。反之,如果随机变量序列ξ1, ξ2…对于任意自然数s,由s个元素所组成的s维空间上的点(ξn+1,…ξn+s)在Gs上均匀分布,则它们是随机数序列。 由于随机数在蒙特卡罗方法中所处的特殊地位,它们虽然也属于由具有已知分布的总体中产生简单子样的问题,但就产生方法而言,却有着本质上的差别。 2).随机数表 为了产生随机数,可以使用随机数表。随机数表是由0,1,…,9十个数字组成,每个数字以0.1的等概率出现,数字之间相互独立。这些数字序列叫作随机数字序列。如果要得到n位有效数字的随机数,只需将表中每n 个相邻的随机数字合并在一起,且在最高位的前边加上小数点即可。例如,某随机数表的第一行数字为7634258910…,要想得到三位有效数字的随机数依次为0.763,0.425,0.891。因为随机数表需在计算机中占有很大内存, 而且也难以满足蒙特卡罗方法对随机数需要量非常大的要求,因此,该方法不适于在计算机上使用。 3).物理方法

真随机数产生方法

ATmega1 28单片机的真随机数发生矗时间:2009-12-16 15:39:00 来源:单片机与嵌入式系统作者:刘晓旭,曹林,董秀成西华大学 ATmega1 28单片机的真随机数发生矗时间:2009-12-16 15:39:00 来源:单片机与嵌入式系统作者:刘晓旭,曹林,董秀成西华大学 引言 随机数已广泛地应用于仿真、抽样、数值分析、计算机程序设计、决策、美学和娱乐之中。常见的随机数发生器有两种:使用数学算法的伪随机数发生器和以物理随机量作为发生源的真随机数发生器。要获取真正随机的真随机数,常使用硬件随机数发生器的方法来获取。这些真随机数都是使基于特定的真随机数发生源(如热噪声、电流噪声等),每次获取的真随机数都是不可测的,具有很好的随机性。 真随机数因其随机性强,在数据加密、信息辅助、智能决策和初始化向量方面有着广泛应用,构建一种基于硬件真随机数发生源,具有广泛的应用价值。但目前硬件真随机数发生源均较复杂,而且很少有基于单片机的真随机数发生器。本文利用RC充放电的低稳定度,根据AVR单片机的特点设计了一种性价比极高的真随机数发生器。该随机数发生器使用元件很少,稳定性高,对一些价格敏感的特殊场合,如金融、通信、娱乐设备等有较大的应用意义。 1 基本原理和方法 1.1 基本原理 串联的RC充放电电路由于受到漏电流、电阻热噪声、电阻过剩噪声、电容极化噪声等诸多不确定性因素的影响,其充放电稳定度一般只能达到10-3。利用这种RC充放电的低稳定度特性实现廉价的真随机数发生源。 Atmel公司AVR单片机ATmega 128以其速度快、功能强、性价比高等优点广泛应用于各种嵌入式计算场合。利用AVR单片机引脚配置灵活多样的特点,使用Amnega128 两个I/O口作为真随机数的电气接口。 其原理如图1所示。主要原理是利用串联RC电路的不确定性产生真随机数源,收集数据,通过AVR单片机ATmega128和主时钟电路量化RC电路的充放电时问,获得不确定的2位二进制数据,再利用程序将每4次采集的数据综合,最后产生1个8位的真随机数。

编写一个产生符合高斯分布的随机数函数

编写一个产生符合高斯分布的随机数函数信号检测与估计课程作业作业要求 1、利用计算机内部函数产生高斯分布的随机数,分别画出500,10000,100000点的波形,并进行统计分析(分别画出概率密度曲线,计算均值与方差) 2、利用计算机自己编写一个产生符合高斯分布的随机数函数,画出100000点的波形,并进行统计分析(同一) 提示:这一问分两步做,第一步先产生一个均匀分布的随机数序列(乘同余法、混合同余法等,可以用自己的方法),第二步通过适当变换得到符合高斯分布概率模型的随机数列 3、对随机数产生函数和高斯分布进行性能分析,并写出自己对于此次作业和上课的学习体会 一、利用内部函数产生高斯分布 首先利用matlab自带的内部函数randn()就可以方便的生成所需要的高斯分布随机数,然后画出概率密度曲线并计算出均值与方差即可。程序代码如下: A=randn(500,1); B=randn(10000,1);

C=randn(100000,1); subplot(2,3,1); bar(A); subplot(2,3,2); bar(B); subplot(2,3,3); bar(C); [f1,x1]=ksdensity(A); subplot(2,3,4); plot(x1,f1); title('500点高斯分布概率密度函数'); [f2,x2]=ksdensity(B); subplot(2,3,5); plot(x2,f2); title('10000点高斯分布概率密度函数'); [f3,x3]=ksdensity(C); subplot(2,3,6); plot(x3,f3); title('100000点高斯分布概率密度函数'); JZ500=mean(A) JZ1000=mean(B) JZ100000=mean(C) FC500=var(A) FC10000=var(B)

随机数生成方法

University of Sydney School of Information Technologies Generating Random Variables Pseudo-Random Numbers Definition : A sequence of pseudo-random numbers ()i U is a deterministic sequence of numbers in []1,0 having the same relevant statistical properties as a sequence of random numbers. The most widely used method of generating pseudo-random numbers are the congruential generators: ()M X U M c aX X i i i i =+=?mod 1 for a multiplier a , shift c , and modulus M , all integers. The sequence is clearly periodic, with maximum period M . The values of a and c must be carefully chosen to maximise the period of the generator, and to ensure that the generator has good statistical properties. Some examples: M a c 259 1313 0 232 69069 1 231-1 630360016 0 232 2147001325 715136305 Reference: Ripley, Stochastic Simulation , Chapter 2

随机数产生方法

伪随机数的产生,现在用得较多的是“线性同余法" 就是下面这个式子 R(n+1) = [R(n) * a + b] mod c 为使随机数分布尽量均匀,a、b 均为质数, c 一般取值域内的最大值(mod 是求余数) 从这个式了可以看出,每次产生的随机数都跟上一次产生的数有关系,那么,第一个数是怎么来的呢?这就是线性同余法中必须用的的”种子",也就是说,给定某个种子后,所产生的随机数序列是固定的,在计算机编程中,一般使用系统时间来初始化种子,就是前面代码中的 srand((unsigned)time(NULL)); 这一句了。因为每次运行程序的时间肯定不一样,所以产生散列肯定也不一样,从而达到“随机”的目的。 a,b,c 的取值我用的是 a=3373, b=1, c=32768 下面的两个子程序是我在我的项目(S7-200 226)中产生随机的系统编号用的,因为我的编号中只有4位数采用了随机数,所以下面的程序中用的是整型,最大范围为32767。如果需要更宽范围的随机数,可以采用双字类型,并适当修改程序,代码很简单,就是将上面那个表达式用 S7-200 的指令表示出来就行了。 这两个子程序是从 MicroWIN V4.0 中导出来的,可以将它们用文本编辑器保存为 AW L 文件后直接导入 MicroWIN。 使用时在第一个扫描周期调用 Srand 初始种子,需要随机数的地方调用 Random Random 有了个最大范围参数,可以限制生成的随机数的最大范围,比如我只需要4位随机数,所以一般这样调用 CALL Random, 10000, vw0,生成的数就在 0-9999 范围内 下面是代码: SUBROUTINE_BLOCK Srand:SBR17 TITLE=初始化随机数种子 // // 直接使用系统时钟的分秒来作为种子 VAR_OUTPUT seed:WORD; END_VAR

概率论与数理统计小报告 正态随机数的产生方法

概率论与数理统计小报告(二)_________正态随机数的产生方法 学院数理学院 专业信息与计算科学 班级 姓名 学号

依据中心极限定理产生正态分布随机数 摘要:由中心极限定理可知,当n很大时,具有期望μ,方差σ2的分布近似为标准正态分布,故可据此产生标准正态分布。并利用Matlab自带的函数对结果进行检验。 关键字:正态分布中心极限定理随机数 正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。 若随机变量服从一个位置参数为、尺度参数为的概率分布,记为: 则其概率密度函数为 正态分布的数学期望值或期望值等于位置参数,决定了分布的位置;其方差的开平方或标准差等于

clc,clear for i=1:1000 R=rand(1,12); X(i)=sum(R)-6; end X=X'; m=mean(X) v=var(X) subplot(1,2,1),cdfplot(X) %绘制经验累计分布函数图,显示了一维向量X的累计概率分布F(x)的图形subplot(1,2,2),histfit(X) %绘制分组数据的柱状分布函数图,即频数图 h=kstest(X, [X normcdf(X, 0,1)])% H = kstest(X)执行Kolmogorov-Smirnov检验标准正态分布比较数据向量x的值。零假设是x为标准的正态分布;另一种假设是x不是标准正态分布。在5%显著水平进行检验,若结果h为1,则说明零假设不成立,拒绝零假设。否则,结果为0,零假设成立,即原分布为标准正态分布 运行结果如下: h = 0 (检验表明分布为标准正态分布) R = (产生的一组12个【0,1】上均匀分布的随机数) Columns 1 through 4 0.5700 0.4027 0.3702 0.0801 Columns 5 through 8

生成高斯分布的matlab程序

clear all; close all; clc; randn('seed',0); %%一维高斯函数 mu=0; sigma=1; x=-6:0.1:6; y=normpdf(x,mu,sigma); plot(x,y); figure; %%二维或多维高斯函数 mu=[00]; sigma=[0.30;00.35]; [x y]=meshgrid(linspace(-8,8,80)',linspace(-8,8,80)'); X=[x(:) y(:)]; z=mvnpdf(X,mu,sigma); surf(x,y,reshape(z,80,80)); hold on; %再生成一个 mu=[40]; sigma=[1.20;0 1.85]; [x y]=meshgrid(linspace(-8,8,80)',linspace(-8,8,80)'); X=[x(:) y(:)]; z=mvnpdf(X,mu,sigma); surf(x,y,reshape(z,80,80)); Matlab 的随机函数(高斯分布均匀分布其它分布) Matlab中随机数生成器主要有: betarnd 贝塔分布的随机数生成器 binornd 二项分布的随机数生成器 chi2rnd 卡方分布的随机数生成器 exprnd 指数分布的随机数生成器 frnd f分布的随机数生成器 gamrnd 伽玛分布的随机数生成器 geornd 几何分布的随机数生成器 hygernd 超几何分布的随机数生成器 lognrnd 对数正态分布的随机数生成器 nbinrnd 负二项分布的随机数生成器 ncfrnd 非中心f分布的随机数生成器

EXCEL随机数据生成方法

求教:我的电子表格中rand()函数的取值范围是-1到1,如何改回1到0 回答:有两种修改办法: 是[1-rand()]/2, 或[1+rand()]/2。 效果是一样的,都可生成0到1之间的随机数 电子表格中RAND()函数的取值范围是0到1,公式如下: =RAND() 如果取值范围是1到2,公式如下: =RAND()*(2-1)+1 RAND( ) 注解: 若要生成a 与b 之间的随机实数: =RAND()*(b-a)+a 如果要使用函数RAND 生成一随机数,并且使之不随单元格计算而改变,可以在编辑栏中输入“=RAND()”,保持编辑状态,然后按F9,将公式永久性地改为随机数。 示例 RAND() 介于0 到1 之间的一个随机数(变量) =RAND()*100 大于等于0 但小于100 的一个随机数(变量) excel产生60-70随机数公式 =RAND()*10+60 要取整可以用=int(RAND()*10+60) 我想用excel在B1单元个里创建一个50-80的随机数且这个随机数要大于A1单元个里的数值,请教大家如何编写公式! 整数:=ROUND(RAND()*(80-MAX(50,A1+1))+MAX(50,A1+1),0) 无需取整数:=RAND()*(80-MAX(50,A1))+MAX(50,A1)

要求: 1,小数保留0.1 2,1000-1100范围 3,不要出现重复 =LEFT(RAND()*100+1000,6) 至于不许重复 你可以设置数据有效性 在数据-有效性设 =countif(a:a,a1)=1 选中a列设有效性就好了 其他列耶可以 急求excel随机生成数字的公式,取值要在38.90-44.03之间,不允许重复出现,保留两位小数,不允许变藏 =round(RAND()*5+38.9,2) 公式下拉 Excel随机数 Excel具有强大的函数功能,使用Excel函数,可以轻松在Excel表格产生一系列随机数。 1、产生一个小于100的两位数的整数,输入公式=ROUNDUP(RAND()*100,0)。 RAND()这是一个随机函数,它的返回值是一个大于0且小于1的随机小数。ROUNDUP 函数是向上舍入数字,公式的意义就是将小数向上舍入到最接近的整数,再扩大100倍。 2、产生一个四位数N到M的随机数,输入公式=INT(RAND()*(M-N+1))+N。 这个公式中,INT函数是将数值向下取整为最接近的整数;因为四位数的随机数就是指从1000到9999之间的任一随机数,所以M为9999,N为1000。RAND()的值是一个大于0且小于1的随机小数,M-N+1是9000,乘以这个数就是将RAND()的值对其放大,用INT 函数取整后,再加上1000就可以得到这个范围内的随机数。[公式=INT(RAND()*(9999-1000+1))+1000] 3、Excel函数RANDBETWEEN是返回位于两个指定数之间的一个随机数。使用这一个函数来完成上面的问题就更为简单了。要使用这个函数,可能出现函数不可用,并返回错误值#NAME?。 选择"工具"菜单,单击"加载宏",在"可用加载宏"列表中,勾选"分析工具库",再单击"确定"。接下来系统将会安装并加载,可能会弹出提示需要安装源,也就是office安装盘。放入光盘,点击"确定",完成安装。 现在可以在单元格输入公式=RANDBETWEEN(1000,9999)。 最后,你可以将公式复制到所有需要产生随机数的单元格,每一次打开工作表,数据都会自动随机更新。在打开的工作表,也可以执行功能键F9,每按下一次,数据就会自动随机更新了。

产生正态分布随机数及M序列

1. 编制两种方法产生正态分布随机数的程序并进行验证分析; 编程思路:产生正态分布随机数的两种方法: (1) 统计近似抽样法: a.设{i y }是(0,1)均匀分布的随机数序列,则 {}1 ()0.5y i i i i E y y p y dy μ===? 1 220 ()()1/12y i y i i y p y dy σμ=-=? b.根据中心极限定理,当N →∞时, 1 1 2 ()2 ()~(0,1)/12 N N i y i i i y N y k N y x k N N N μ σ==--= = ∑∑ c.如需产生均值为x μ,方差为2x σ的正态分布随机变量x ,只需如下计算: 212 ~(,)/12 N i i x x x x N y x N N μσμσ=- =+∑,试验证明12N =时,x 的统计性质就 比较理想了。 (2) 变换抽样法: 设12,y y 是两个相互独立的(0,1)均匀分布的随机变量,则新变量 1/21121/2 212(2log )cos(2) (2log )sin(2) x y y x y y ππ?=-?=-? 是相互独立的,服从(0,1)N 分布的随机变量。 利用统计近似抽样法和变换抽样法的定义及之前产生(0,1)均匀分布的随机数的基本方法如乘同余法、混合同余法等产生正态分布随机数。 调试过程遇到的问题:(1)在用统计近似抽样法产生正态分布随机数时,给定,μσ,然后用 Matlab 自带函数检验结果,感觉数据老对不上? 解决方法:自己设定的,μσ分别是均值,标准差,利用Matlab 自带函 数mean(),var()计算出来的分别是均值,方差,总觉得方差老对不上,其实是自己理解问题,var()计算出来的方差数值肯定是自己设定的标准差的平方大小左右。 (2)Matlab 下标从1开始;做运算两个矩阵的尺寸大小得对应上,还有 调用的值一定得有值。 程序运行结果分析得到的结论: (1)统计近似抽样法:

一维正态分布随机数生成算法

一维正态分布随机数生成算法 班级:###班姓名:### 学号:########## 一、介绍: 正态分布在数理统计中具有基础性的作用,因此产生高质量的正态分布有重要的意义。本报告中通过利用MATLAB工具,来编译并且运行算法,通过本算法可以产生符合一维正态分布的随机数,从而达到本报告的作用,通过绘制正态分布的图形,说明算法的正确性。 正态分布的定义:若连续随机变量§的概率密度为 然而,得到服从正态分布的随机数的基本思想是先得到服从均匀分布的随机数,再将服从均匀分布的随机数转变为服从正态分布。 二、算法过程: 1.利用中心极限定理

2、产生服从N(μ,σ2)的算法步骤: (1) 产生n 个RND 随机数:r 1,r 2,…,r n ; (2) (3) 计算 y =σx +μ ,y 是服从 N(μ,σ2) 分布的随机数。 3、原理分析: 设ζ1,ζ2,…,ζn 是n 个相互独立的随机变量,且ζi ~U(0,1), i = 1,2, …,n, 由中心极限定理知 : ,渐近服从正态分布N(0, l )。 注意:我们现在已经能产生[0,1]均匀分布的随机数了,那么我们可以利用这个定理来产生标准正态分布的随机数。 现在我们产生n 个[0,1]均匀分布随机数, 我们有: 为方便起见,我们特别选 n = 12,则 : 这样我们很方便地就把标准正态分布随机数计算出来了。 ; / )(112 2∑=-=n i n n i r x 计算,12 1 )()(21= =i i D E ζζ,有∑=-=n i n n i 1 12 2/)(ζηn r r r ,,,21 ? ?? ? ??-=∑=211121n i i r n n u ∑=-=12 1 6 i i r u

随机数序列的产生方法

随机数的产生 摘要 本文研究了连续型随机数列的产生,先给出了均匀分布的随机数的产生算法,在通过均匀分布的随机数变换得到其他连续型随机数的产生算法.我们给出了产生均匀分布随机数的算法,然后探讨了同余法的理论原理.通过均匀随机数产生其他分布的随机数,我们列举了几种通用算法,并讨论各个算法的优缺点。 正文 一、 随机数与伪随机数 随机变量η的抽样序列12,,n ηηη ,…称为随机数列. 如果随机变量η是均匀分布的,则η的抽样序列12,,n ηηη ,…称为均匀随机数列;如果随机变量η是正态分布的随机变量则称其抽样序列为正态随机数列. 比如在掷一枚骰子的随机试验中出现的点数x 是一个随机变量,该随机变量就服从离散型均匀分布,x 取值为1,2,3,4,5,6,取每个数的概率相等均为1/6.如何得到x 的随机数?通过重复进行掷骰子的试验得到的一组观测结果12,,,n x x x 就是x 的随机数.要产生取值为0,1,2,…,9的离散型均匀分布的随机数,通常的操作方法是把10个完全相同的乒乓球分别标上0,1,2,…,9,然后放在一个不透明的袋中,搅拦均匀后从中摸出一球记号码1x 后放回袋中,接着仍将袋中的球搅拌均匀后从袋中再摸出一球记下号码2x 后再放回袋中,依次下去,就得到随机序列12,,,n x x x .通常称类似这种摸球的方法产生的随机数为真正的随机数.但是,当我们需要大量的随机数时,这种实际操作方法需要花费大量的时间,通常不能满足模拟试验的需要,比如教师不可能在课堂上做10000次掷硬币的试验,来观察出现正面的频率.计算机可以帮助人们在很短时间产生大量的随机数以满足模拟的需要,那么计算机产生的随机数是用类似摸球方法产生的吗?不是.计算机是用某种数学方法产生的随机数,实际上是按照一定的计算方法得到的一串数,它们具有类似随机数的性质,但是它们是依照确定算法产生的,便不可能是真正的随机数,所以称计算机产生的随机数为伪随机数.在模拟计算中通常使用伪随机数.对这些伪随机数,只要通过统计检验符合一些统计要求,如均匀性、随机性

Java中产生随机数

一、利用random方法来生成随机数。 在Java语言中生成随机数相对来说比较简单,因为有一个现成的方法可以使用。在Math类中,Java语言提供了一个叫做random的方法。通过这个方法可以让系统产生随机数。不过默认情况下,其产生的随机数范围比较小,为大于等于0到小于1的double型随机数。虽然其随机数产生的范围比较小,不能够满足日常的需求。如日常工作中可能需要产生整数的随机数。其实,只要对这个方法进行一些灵活的处理,就可以获取任意范围的随机数。 如我们可以先通过random方法生成一个随机数,然后将结果乘以10。此时产生的随机数字即为大于等于0小于10的数字。然后再利用Int方法进行转换(它会去掉小数掉后面的数字,即只获取整数部分,不是四舍五入)。最后即可获取一个0到9的整数型随机数字。其实现方法很简单,就是对原有的random方法按照如下的格式进行变型:(int)(Math.Random()*10)即可。其实我们还可以对这个方法进行扩展,让其产生任意范围内的随机数。至需要将这个10换成n即可,如改为(int)(Math.Random()*n)。此时应用程序就会产生一个大于等于0小与n之间的随机数。如将n设置为5,那么其就会产生一个0到5之间的整数型的随机数。如果将这个写成一个带参数的方法,那么只要用户输入需要生成随机数的最大值,就可以让这个方法来生成制定范围的随机数。在Java中定义自己的工具库有时候程序员可能需要生成一个指定范围内的随机偶数或者奇数。此时是否可以通过这个方法来实现呢?答案是肯定的。如现在程序要需要生成一个1-100范围内的偶数。此时该如何实现?首先,需要生成一个0到99之内的随机数(至于这里为什么是99,大家耐心看下去就知道原因了)。要实现这个需求,很简单吧,只要通过如下语句就可以实现:i=1+(int)(Math.Random()*100)。其中(int)(Math.Random()*99)产生0到99的整数型随机数。然后再加上1就是产生1到100之间的随机整数。然后将产生的随机数赋值给变量i。但是此时其产生的随机数即有偶数,又有奇数。而现在程序员需要的是一个随机的偶数。那么我们可以在后面加上一个if判断语句。将这个随机数除以2,如果没有余数的话(或者余数为0)则表明这个随机数是偶数,直接返回即可。如果其返回的余数不为零,那么就表明其是奇数,我们只要加上1就变为了偶数,返回即可。注意,在上面的随机数生成中,笔者采用的范围是0到99,然后再加上1让其变为1到100的随机数。最后的结果就是生成1到100之间的随机偶数。其实,如果要范围随机奇数的话,至需要对上面的语句进行稍微的修改即可。Java: 改变你我的世界 假设现在用户想生成一个任意范围内的奇数或者偶数,能够实现吗?假设现在用户想实现一个m到n之间的任意偶数 要产生X到Y的随机数 先产生的0到Y-X随机数 然后加上X 可见虽然random方法其自身产生的随机数有比较严格的范围限制。但是只要对其进行合理的转换,程序员仍然可以采用这个方法产生用户所需要的随机数据。 二、通过Random类来生成随机数。 在Java语言中,除了可以通过random 方法来产生随机数之外,还可以通过一个

编写一个产生符合高斯分布的随机数函数

信号检测与估计课程作业 作业要求 1、利用计算机内部函数产生高斯分布的随机数,分别画出500,10000,100000点的波形,并进行统计分析(分别画出概率密度曲线,计算均值与方差) 2、利用计算机自己编写一个产生符合高斯分布的随机数函数,画出100000点的波形,并进行统计分析(同一) 提示:这一问分两步做,第一步先产生一个均匀分布的随机数序列(乘同余法、混合同余法等,可以用自己的方法),第二步通过适当变换得到符合高斯分布概率模型的随机数列 3、对随机数产生函数和高斯分布进行性能分析,并写出自己对于此次作业和上课的学习体会 一、利用内部函数产生高斯分布 首先利用matlab自带的内部函数randn()就可以方便的生成所需要的高斯分布随机数,然后画出概率密度曲线并计算出均值与方差即可。程序代码如下: A=randn(500,1); B=randn(10000,1); C=randn(100000,1); subplot(2,3,1); bar(A); subplot(2,3,2); bar(B); subplot(2,3,3); bar(C); [f1,x1]=ksdensity(A); subplot(2,3,4); plot(x1,f1); title('500点高斯分布概率密度函数'); [f2,x2]=ksdensity(B); subplot(2,3,5); plot(x2,f2); title('10000点高斯分布概率密度函数'); [f3,x3]=ksdensity(C); subplot(2,3,6); plot(x3,f3); title('100000点高斯分布概率密度函数'); JZ500=mean(A) JZ1000=mean(B)

一维正态分布随机数序列产生的几种方法介绍

一维正态分布随机数序列产生的几种方法介绍 【摘要】正态分布在数理统计中具有基础性的作用,因此产生高质量的正态分布有重要的意义。我们将介绍几种数值方法求正态分布:中心极限定理,Hasiting 有理逼近法,统计工具箱,反函数法,舍选法,R 软件及一维正态随机数的检验。 【关键词】正态分布;一维;随机数。 一.利用中心极限定理 中心极限定理:(一般 n≥10), 产生服从N(μ,σ2)的算法步骤: (1)产生n 个RND 随机数:r 1,r 2,…,r n ; (2) (3) 计算 y =σx +μ ,y 是服从 N(μ,σ2) 分布的随机数。 原理分析: 设ζ1,ζ2,…,ζn 是n 个相互独立的随机变量,且ζi ~U(0,1), i = 1,2, …,n, 由中心极限定理知 : ,渐近服从正态分布N(0, l )。 注意:我们现在已经能产生[0,1]均匀分布的随机数了,那么我们可以利用这个定理来产生标准正态分布的随机数。 现在我们产生n 个[0,1]均匀分布随机数, 我们有: 为方便起见,我们特别选 n = 12,则 : 这样我们很方便地就把标准正态分布随机数计算出来了。 在C 语言中表示为: 例1:利用中心极限定理产生标准正态分布随机数并检验 % example 1 n r r r ,,,21 ??? ? ??-=∑=211121n i i r n n u ∑=-=12 16 i i r u ; / )(1122∑=-=n i n n i r x 计算,12 1)()(21 ==i i D E ζζ,有∑=-=n i n n i 1122/)(ζη

clc,clear for i=1:1000 R=rand(1,12); X(i)=sum(R)-6; end X=X'; m=mean(X) v=var(X) subplot(1,2,1),cdfplot(X) subplot(1,2,2),histfit(X) h=kstest(X, [X normcdf(X, 0,1)]) 结果为:H=0, 接受原假设,变换后的确为标准正态分布。 二.Hasiting 有理逼近法 这是一种计算速度快,也能满足一定精度的算法。我们可以构造分布函数反函数的近似逼近公式,来产生标准正态分布的随机数。其计算公式为:

用c语言产生随机数

用c语言产生随机数 在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。 可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。 rand()会返回一随机数值,范围在0至RAND_MAX 间。返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,(其值至少为32767)我运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。具体见下面的例子。 一如何产生不可预见的随机序列呢 利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。 在C语言里所提供的随机数发生器的用法:现在的C编译器

都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535; 2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间) 3) 根据需要多次调用rand(),从而不间断地得到新的随机数; 4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。 下面是0~32767之间的随机数程序: #include #include #include //使用当前时钟做种子 void main( void ) {int i; srand( (unsigned)time( NULL ) ); //初始化随机数 for( i = 0; i < 10;i++ ) //打印出10个随机数 printf( " %d\n", rand() ); } 根据上面的程序可以很容易得到0~1之间的随机数: #include

相关主题
文本预览
相关文档 最新文档