`
luowei31
  • 浏览: 81220 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

用rand()和srand()产生伪随机数的方法总结 (转载)

ASP 
阅读更多
用rand()和srand()产生伪随机数的方法总结
---------------------------------
标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数:

函数一:intrand(void);
从srand(seed)中指定的seed开始,返回一个[seed,RAND_MAX(0x7fff))间的随机整数。

函数二:voidsrand(unsignedseed);
参数seed是rand()的种子,用来初始化rand()的起始值。

可以认为rand()在每次被调用的时候,它会查看:
1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用
srand(seed)一次来初始化它的起始值。
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。

根据上面的第一点我们可以得出:
1) 如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。
2) 否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed,RAND_MAX(0x7fff))之间的一个随机取得的值。
3) 如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。

举几个例子,假设我们要取得0~6之间的随机整数(不含6本身):

例一,不指定seed:
for(inti=0;i<10;i++){
ran_num=rand()%6;
cout<<ran_num<<"";
}
每次运行都将输出:5544540042

例二,指定seed为定值1:
srand(1);
for(inti=0;i<10;i++){
ran_num=rand()%6;
cout<<ran_num<<"";
}
每次运行都将输出:5544540042
跟例子一的结果完全一样。

例三,指定seed为定值6:
srand(6);
for(inti=0;i<10;i++){
ran_num=rand()%6;
cout<<ran_num<<"";
}
每次运行都将输出:4151434422
随机值也是在[0,6)之间,随得的值跟srand(1)不同,但是每次运行的结果都相同。

例四,指定seed为当前系统流逝了的时间(单位为秒):time_ttime(0):
#include<ctime>
//…
srand((unsigned)time(0));
for(inti=0;i<10;i++){
ran_num=rand()%6;
cout<<ran_num<<"";
}
第一次运行时输出:0154502342
第二次:3230355223
总之,每次运行结果将不一样,因为每次启动程序的时刻都不同(间隔须大于1秒?见下)。

关于time_ttime(0):

time_t被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。比如假设输出:
cout<<time(0);
值约为1169174701,约等于37(年)乘365(天)乘24(小时)乘3600(秒)(月日没算)。

另外,关于ran_num=rand()%6,

将rand()的返回值与6求模是必须的,这样才能确保目的随机数落在[0,6)之间,否则rand()的返回值本身可能是很巨大的。
一个通用的公式是:
要取得[a,b)之间的随机整数,使用(rand()%(b-a))+a(结果值将含a不含b)。
在a为0的情况下,简写为rand()%b。

最后,关于伪随机浮点数:

用rand()/double(RAND_MAX)可以取得0~1之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模),举例:
doubleran_numf=0.0;
srand((unsigned)time(0));
for(inti=0;i<10;i++){
ran_numf=rand()/(double)(RAND_MAX);
cout<<ran_numf<<"";
}
运行结果为:0.716636,0.457725,…等10个0~1之间的浮点数,每次结果都不同。

如果想取更大范围的随机浮点数,比如1~10,可以将
rand()/(double)(RAND_MAX)改为rand()/(double)(RAND_MAX/10)
运行结果为:7.19362,6.45775,…等10个1~10之间的浮点数,每次结果都不同。
至于100,1000的情况,如此类推。

以上不是伪随机浮点数最好的实现方法,不过可以将就着用用…

来源:http://data.gameres.com/document.asp?TopicID=71572

分享到:
评论

相关推荐

    用rand()和srand()产生为随机数的方法总结

    使用 rand() 和 srand() 产生随机数的方法总结 rand() 和 srand() 是 C++ 标准库 `&lt;cstdlib&gt;` 中提供的两个函数,用于生成伪随机数。其中,rand() 函数生成随机整数,而 srand() 函数用来初始化 rand() 的种子值。...

    产生伪随机数

    标题“产生伪随机数”指的是利用特定算法生成看似随机但实际上可预测的数字序列。这个过程在C语言中可以通过标准库函数`rand()`来实现,但为了更深入地理解并定制随机数生成器,我们可以采用中间提取法。 中间提取...

    c语言中rand()和srand()产生随机数方法比较

    `rand()` 和 `srand()` 是C标准库 `&lt;cstdlib&gt;`(或 `&lt;stdlib.h&gt;`)中的两个关键函数,它们一起用于产生伪随机数序列。下面将详细讲解这两个函数的工作原理、使用方法以及它们之间的关系。 `rand()` 函数: `rand()`...

    伪随机数的产生PPT

    C语言提供了一种简单的方式来生成伪随机数,主要通过`rand()`函数和`srand()`函数。这两个函数通常被包含在`&lt;stdlib.h&gt;`头文件中,而`srand()`函数还依赖于`&lt;time.h&gt;`头文件来获取当前时间,以实现随机数序列的初始...

    c语言中rand和srand的用法

    现在,让我们来看看一个使用rand和srand函数的例子。假设我们想生成介于1到10之间的随机数值,可以使用以下代码: ```c #include main(){ int i,j; for(i=0;i;i++){ j=1+(int)(10.0*rand()/(RAND_MAX+1.0)); ...

    C语言srand和rand用法详解

    在C语言中,`srand` 和 `rand` 是两个常用于生成伪随机数的重要函数。它们在各种应用程序中都有广泛的应用,如游戏开发、密码学、统计模拟等。通过合理地使用这两个函数,可以有效地增强程序的功能性和趣味性。 ###...

    用C语言的rand()和srand()产生伪随机数的方法总结

    标准库(被包含于中)提供两个帮助生成伪随机数的函数:  函数一:int rand(void);  从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。  函数二:void srand(unsigned ...

    伪随机数产生程序

    在计算机科学中,伪随机数生成器(PRNG)是一种算法,它能够产生一系列看起来随机但实际上可预测的数字序列。这种数字序列对于许多应用来说非常有用,比如在模拟和游戏开发中,因为它们能提供一致但看似无规律的结果...

    weisuijishu.rar_伪随机_伪随机数 数的保存_生成器_随机数生成

    VC++作为C++的编译环境,提供了标准库 `&lt;cstdlib&gt;` 和 `&lt;ctime&gt;`,其中包含了 `rand()` 函数用于生成伪随机数,以及 `srand()` 函数用于设置种子。 在这个特定的VC++程序中,用户可以自定义生成的伪随机数的数量,...

    suijishu.rar_伪随机数_伪随机数生成_生成随机数_随机数

    在C语言中生成伪随机数,我们需要使用 `srand()` 初始化随机数生成器,并用 `rand()` 获取随机数。正确设置种子和处理范围限制是确保生成随机数满足需求的关键。通过深入理解这两个函数的工作原理和使用方式,我们...

    PHP mt_rand 伪随机数安全探讨 .pdf

    `mt_rand`函数依赖于Mersenne Twister算法,该算法能产生大量的随机数序列,但由于它是伪随机数生成器(PRNG),意味着其生成的数字序列看似随机,实则具有可预测性。在PHP中,`mt_rand`的种子(seed)是基于`...

    伪随机数生成器.ppt

    总结,伪随机数生成器是计算机科学中的重要工具,其选择和使用需考虑应用需求,包括不可预测性、均匀性、效率和周期等特性。在C语言中,我们常常使用线性同余法实现的 `rand()` 函数来生成伪随机数。了解并掌握这些...

    //用到了time函数,获取系统时间值,做为随机种子 //用到了srand 设置随机种子 //用到了rand函数,用来产生随机

    //用到了rand函数,用来产生随机数字的 //代码思路过程: //程序首先 产生一个随机数字 //进入循环,提示用户输入要猜测的数字,范围是0到100 //接收用户输入的值num //分析输入的数值与要猜测数字的关系,并给出...

    srand和rand简介.pdf

    它返回一个介于 0(包含)和 `RAND_MAX`(不包含)之间的伪随机数。`RAND_MAX` 是一个常量,表示 `rand` 能产生的最大值,通常是一个很大的整数。 在实际使用中,通常会结合 `time` 函数来设置种子,以确保每次程序...

    伪随机数发生器160位

    在这个C语言编写的软件中,开发者可能使用了C标准库中的函数来辅助实现,例如`&lt;stdio.h&gt;`用于输入输出,`&lt;stdlib.h&gt;`中的`rand()`和`srand()`函数用于基本的随机数生成,以及可能使用了`&lt;time.h&gt;`来获取当前时间作为...

    伪随机数产生实例(C语言实例)

    ### 伪随机数产生实例(C语言实例) #### 背景介绍 在许多实际应用场景中,例如模拟、游戏开发、安全系统等,都需要使用到随机数。然而,计算机生成的随机数通常并非真正的随机数,而是通过算法计算出的一系列数值...

    Rand函数详细讲解

    在使用rand()函数之前,必须用srand()函数来设置随机数生成器的种子值。如果没有设置种子,程序默认使用1作为种子,这将导致每次生成相同的随机数序列。srand()函数通常接收一个时间相关或环境相关的变化值作为参数...

Global site tag (gtag.js) - Google Analytics