⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rand.txt

📁 随机数函数的使用
💻 TXT
字号:
在C++语言中,取随机数用的是Rand()函数,另外还提供了Srand()随机化函数。本文就这两个函数的应用及对比作一分析。
? Rand函数
Rand()函数生成0到Rand_Max的一个无符号整数。Rand_Max是在<cstdlib>头文件中定义的一个符号常量,其定义语句是:
/* Maximum value that can be returned by the rand function. */
#define RAND_MAX 0x7fff
可以看出,Rand_Max的值为32767,是一个两字节整数所能表达的最大值。根据概率学,如果Rand()确实以随机方式生成整数值,那么每次调用Rand()时,0到Rand_max之间的每个数出现的机会(概率)是一样的。我们可以用一个例子来说明:
//Example1.1:
#include <iostream>
#include <cstdlib>

using std::cout;
using std::endl;

#include <iomanip>

using std::setw;

int main()
{
 int i;
 for (i=1;i<=10;i++)
  cout << setw(10) << rand() << endl;
 return 0;
}
但要注意的是,这里所取的随机值都在32767以内。但如果你仔细运行几遍这个程序,你会发现,每次得到的结果是一样的。这是为何呢?函数Rnad其实是一个伪随机数(Pseudo-random numbers),重复调用Rand会生成看上去是随机产生的一系列数值,然而,这一系列数值会在程序执行时重复出现。这一特性看上去虽然很愚笨,但这正是证明程序能正常工作的一个关键。
那你要问,如何使每次运行程序得到不一样的随机值呢?也只有这样,才能称得上是真正的随机。那就要用到我们的第二个函数Srand()――随机化函数。下面我们就来认识这位朋友。
? Srand函数
Srand()的函数原型――void srand( unsigned int seed );
通过函数原型可以看出,Srand函数没有返回值,在使用时,需要提供一个种子值作为参数,其种子值被定义为Unsigned int,即无符号整数。Int值至少是两个字节,两字节的unsigned int的取值范围为0~65535之间,而四字节的unsigned int,其值范围可以达到0~4294967295之间。Srand函数中内嵌了一个Rand函数,以便在每次执行程序时生成不同的随机数系列。提供的无符号整型参数值不同,得到的随机值也不同,这样就保证了每次得到值的随机性。
//Example2.1:
#include <iostream>
#include <cstdlib>

using std::cout;
using std::endl;

#include <iomanip>

using std::setw;

int main()
{
 int i;
 srand(56);
 for (i=1;i<=10;i++)
  cout << setw(10) << rand() << endl;
 return 0;
}
通过改变随机值,可以得到不同序列的数值。当然这个程序可以设计成让用户每次输入一个种子值,这只需定义一个unsigned int型的变量即可。不过这样的程序还是不太理想,因为每次都要求输入种子值,显得繁琐。有什么办法让程序自取数值作为种子值呢?利用系统时间是个好办法。C++中提供了Time()函数来获取系统时钟。程序如下:
//Example2.2:
#include <iostream>
#include <cstdlib>
#include <ctime>

using std::cout;
using std::endl;


#include <iomanip>

using std::setw;

int main()
{
 int i;
 srand(time(0));
 for (i=1;i<=10;i++)
  cout << setw(10) << rand() << endl;
 return 0;
}
这样程序每次运行所生成的随机数系列会“不同”。注意:Time(0)参数0返回当前“日历时间”的秒数。Srand函数只需在程序中调用一次,就可以获得所需的随机化效果,多次调用不仅徒劳无益,还会降低程序性能。
? 自定义随机取值范围
我们不是任何时候都需要从0~65535这么大的范围中取随机值,譬如统计男、女生出现可能性只需0和1两种可能,统计七种颜色的变化只需0~6七个数值,统计投掷骰子每个数字的可能性只需1~6六个数值,诸如此类的情况有很多种,这就使我们认识到单纯应用上述两个函数无法满足实际需要。如何来自定义随机数的取值范围呢?我们有一个很巧妙的方法。
我们都学过求模运算(%),利用%可以定义取值范围,比如取1~6的值,可以用1+Rand()%6,因为余数必须比除数小,所以Rand()%6的值为0~5,加上1则值范围为1~6。这被称为“比例缩放”,数字6被称为“比例因子”。我们可以对这个结果进行一般化处理:n = a + rand() % b;a 指的是“位移值”(相当于所需的连续整数范围内的宽度值)。

  综上所述,如果我们需要随机取值,可以使用Rand()函数,但这只是“伪随机数”,只有用Srand()函数进行随机化处理,才能保证每次所取的随机数序列的随机性。
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -