随机函数详解+浅谈洗牌算法

在C++中的 rand() 函数可以用来产生随机数。

在使用 rand() 函数的时候,首先需要包含头文件  #include<stdlib.h>,

用法是  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<iostream>
#include<cstdlib>// 包含随机函数的头文件;
#include<time.h>// 包含时间函数的头文件;
#include<cstdio>
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<iostream>
#include<cstdio>
#include<time.h>// 时间函数
#include<cstdlib> //包含随机数的头文件
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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值