c语言——随机化算法

一、函数srand

1.随机化种子

			srand((unsigned int)time(NULL));
			若不随机则生成的都为1 相同值

2.rand(time(NULL))

		做产生随机数的种子;

3.产生随机数

		x=(double)rand()/RAND_MAX;
		rand()后若为/则是随机生成0~1之间的数 
			若为%则是生成0~RAND_MAX之间的数(RAND_MAX为最大值32767)
		rand()前为产生的随机数的类型;
		rand()%n+m;产生m到n之间的整数;

二、伪随机数函数rand();

1.rand() 每次产生的随机数都相同

#include<stdio.h>
#include<stdlib.h>

int main()
{
	for(int i=0;i<6;i++)
	{
		printf("%d\n",rand());
	}
 } 

三、random函数和randomize函数——产生随机数

1.randomize()用于初始化随机数发生器
2.random()每次产生不同的随机数;
3.在ANSI c++中没有包括randomize函数和random函数

#include<stdio.h>
#include<stdlib.h>

int main()
{
	randomize();
	for(int i=0;i<6;i++)
	{
		printf("%d\n",random(20));
	}
 } 

四、例子:用srand()产生随机数。求π;

1.在0~1之间产生随机数x,y
2.设产生n次随机数,随机数产生在S’为m次
3.π=k=m/n;
在这里插入图片描述

//求π
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
	int n,m=0;//m为正方形的面积 
	double x,y;
	srand((unsigned int)time(NULL));//随机化种子  若不随机则生成的都为1 相同值
	scanf("%d",&n);
	srand(time(NULL)); //让time(NULL)做种子;
	for(int i=0;i<n;i++)
	{
		x=(double)rand()/RAND_MAX;//rand()后为/则是随机生成0~1之间的数 若为%则是生成0~RAND_MAX之间的数(RAND_MAX为最大值32767)
		y=(double)rand() / RAND_MAX;
		
		if(x*x+y*y<=1)
			m++;
	}
	printf("%d ",m);//在扇形内的值; 
	printf("%.4f",4.0*m/n);//π
	return 0;
}

五、用srand()产生随机数。实现 洗牌和发牌;

  1. 洗牌——创建一个数组存放54个不重复的随机数;

  2. 发牌——创建两个字符数组存放花色和牌的点数,将数组中的数导到花色和牌的点数的字符数组(花色=随机数%4;牌点数=随机数%13)

//洗牌,发牌; 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 60
void xipai(int pai[N]);
void fapai(int pai[N]);
int main()
{
	int pai[N];
	srand((unsigned int)time(NULL));
	xipai(pai);
	fapai(pai);


	 return 0;
} 

void xipai(int pai[N])//数组中:修改main函数传递到子函数的数组 也就修改了main函数 
{
	int j,i;
	srand(time(NULL));
	for( i=0;i<54;i++)
	{
		pai[i]=(int)rand()%54+1;//生成1~54的整数
		if(i!=0)
			j=i-1;
		while(j--)//查找重复的牌数;
		{
			if(pai[i]==pai[j])
				i--;
		}
	}


}

void fapai(int pai[N])
{
	char hua[4][8] = {{"黑桃"},{"梅花"},{"红桃"},{"方块"}};//这里黑桃··· (一个汉字是两个字符,两个汉字是4个字符 另外还有“”也占字符位置)所以需要些二维数组 不然会超过申请的空间;
	char dian[13][3] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; 
	for(int i=1;i<=54;i++)
	{
		if(pai[i]==53)
		{
			printf("小王\n");
			continue ;
		}		
		if(pai[i]==54)
		{
			printf("大王\n");
			continue ;//遇到大王时,跳过此次循环
		}	
		printf("%s %s\n",hua[pai[i]%4],dian[pai[i]%13]);//牌点数除以13取余正好数 可以的到牌的点数 除以4取余正好可以在四种花色中选
		
	}
	
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值