在C++中的 rand() 函数可以用来产生随机数。
在使用 rand() 函数的时候,首先需要包含头文件 #include
用法是 int rand( ),产生的随机数范围是0~65536,类型为unsigned int,不能超过范围。rand()函数不接受参数,默认以1为种子(即起始值)。
随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。
若要不同,此时需要使用函数srand()进行初始化。srand() 函数用来初始化随机数发生器,用法为void srand(unsigned int seed),参数seed必须是个整数,如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
可以利用srand((unsigned int)(time(NULL))的方法,产生不同的随机数种子,因为每一次运行程序的时间是不同的。
产生随机数:
1、给srand()提供一个种子,它是一个unsigned int类型;调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到RAND_MAX之间);
2、根据需要多次调用rand(),从而不间断地得到新的随机数;
3、无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
4、产生一定范围随机数的通用表示公式:
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
实列:
#include
#include// 包含随机函数的头文件;
#include// 包含时间函数的头文件;
#include
int main()
{
srand((unsigned)time(NULL));// 随机数种子,但要注意放在循环外;
for(int i=1;i<=5;i++)// 随机产生5个0-99内的随机数
printf("%d ",rand()%100);
return 0;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
简单的小应用(百度面试题)
在斗地主的小游戏中,为了保证玩家手中牌的随机性,我们可以对洗牌过程进行模拟。
在现实中我们的洗牌过程很简单,但要用计算机来进行模拟,要怎么办呢。
我们可以将54张牌看做长度为54的数组(当然也可以再长点),数组中每个元素对应一张牌,那么洗牌的过程就相当于对数组元素的重新排列,随机重排后依次发给玩家,就可以保证玩家的牌是随机的。
在 C++中可以利用随机函数,利用这个函数,可以产生0-53的随机数,假设产生 x,将 x 放到另一个数组中存储直到原数组的所有元素全部放到存储数组中。
但是简单一想,如果随机数重复怎么办,即使重复的数进行标记,那也会有无效的时间浪费,那就需要我们将产生的随机数从原数组中去除,直到完成模拟过程。
仔细想想,也存在着更好的方法,每次我们只需要将产生的随机数与数组的最后一位交换即可。
例如:第一次我们在a数组0-53的数中产生了a[3] ,那么我们就将 a[3]与 a[53] 交换,第二次在0-52中进行随机数的选择。
依次进行,直到选择完成。这样做的好处是不用额外开数组,时间复杂度优化到 O (n), 空间复杂度优化到 O(1).
看下这有意思代码:
#include
#include
#include// 时间函数
#include //包含随机数的头文件
using namespace std;
int a[110];
int main()
{
for(int i=1;i<=53;i++) a[i]=i;
srand((unsigned)time(NULL));// 可以根据程序运行时间的不同产生不同的随机数种子;
for(int i=53;i>=1;i--)
{
int x=rand()%i+1;// 在1-i 之间产生随机数;
printf("%d ",a[x]);
swap(a[x],a[i]);
}
return 0;
}