模拟算法_掷骰子与猜数字所有类型

模拟算法是用随机函数来模拟自然界中发生的不可预测的情况,C语言中是用srand()和rand()函数来生成随机数。

先来介绍一下随机数的生成:

1.产生不定范围的随机数

函数原型:int rand()

产生一个介于0~RAD_MAX间的整数,其具体值与系统有关系。Linux下为2147483647。我们可以在include文件夹中的stdlib.h中可以看到(Linux在usr目录下,Windows在安装目录下)

1 #include<stdio.h>
2 #include<stdlib.h>
3 int main()
4 {
5 int i;
6 for(i=0; i<10; i++) //随机产生10个数。
7 {
8 printf("%d\n", rand());
9 }
10 return 0;
11 }

2.产生指定范围的随机数(产生0到某个数的随机数)

Radom(x)(rand()%x) [0,x)

#include<stdio.h>
#include<stdlib.h>
#define Random(x) (rand() % x) //通过取余取得指定范围的随机数
int main()
{
int i;
int dis; //产生[0, dis)之间的随机数,注意不包括dis
for(i=0; i<10; i++)
{
printf("%d\n", Random(dis));
}
return 0;
}

3.生成指定范围的随机数
要求:指定范围(m,n),随机数包括m,n;

方法:将范围(m,n)改变到(0,x)最后再转移回去。

1)m=n。此时并不算严格意义上的随机数,返回m;

2)m>n。令pos=n,距离差dis=m-n+1

返回rand()%dis+pos;

3)n>m。令pos=n,距离差dis=n-m+1

返回rand()%dis+pos;

1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<time.h>
4 int Random(int m, int n)
5 {
6 int pos, dis;
7 if(m == n)
8 {
9 return m;
10 }
11 else if(m > n)
12 {
13 pos = n;
14 dis = m - n + 1;
15 return rand() % dis + pos;
16 }
17 else
18 {
19 pos = m;
20 dis = n - m + 1;
21 return rand() % dis + pos;
22 }
23 }
24 int main()
25 {
26 int i, m, n;
27 srand((int)time(NULL));
28 m = -3;
29 n = -7;
30 for(i=0; i<10; i++)
31 {
32 printf("%d\n", Random(m, n));
33 }
34 return 0;
35 }

下面给出掷骰子游戏和猜数游戏的代码:

掷骰子游戏:

#include<stdio.h>
#include<time.h>
int main()
{
int m,i,n=0,s=0;
srand(time(NULL));
printf(“请输入要掷骰子的次数:”);
scanf("%d",&m);
for(i=1;i<=m;i++)
{
n=rand()%6+1;//生成骰子的六位随机面
printf(“第%d次骰子的点数为:%d\n”,i,n);
s=s+n;
}
printf(“你一共郑了%d次骰子!\n”,m);
printf(“骰子的总点数为:%d”,s);
return 0;
}

猜数游戏:

1 //生成100以内的随机数
2 #include<stdio.h>//包含生成随机数的函数
3 #include<time.h>
4 int main()
5 {
6 int m,n,i=0;//i在此要先赋初值0
7 srand(time(NULL));
8 n=rand()%100+1;//rand生成的随机数可达65000多,这里除以100
9 do{
10 printf(“请输入所猜数字:”);
11 scanf("%d",&m);
12 i++;
13 if(m>n)
14 printf(“你猜的数太大了!\n”);
15 else if(m<n)
16 printf(“你猜的数太小了!\n”);
17 }while(m!=n);
18 printf(“你一共猜了%d次,”,i);
19 if(i<=5)
20 printf(“你很聪明!”);
21 else
22 printf(“你还要多努力!”);
23 return 0;
24 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值