rand函数

作用

在运行程序后被调用时返回一个 0 ~ 32767 间的随机数

语法

需要的头文件为:stdlib.h

语法示例
​
#include<stdlib.h>

int main()
{
    int a = rand();
    return 0;
}

​

缺陷

示例
​
#include<stdlib.h>
#include<stdio.h>

int main()
{
    int i = 0;
    for (; i < 10; i++)//一个循环 10 次打印“随机值”的 for 语句
    {
        int a = rand();
        printf("%d\n", a);
    }


    return 0;
}

​

当我们反复运行以上程序不难发现,打印出的随机数顺序都是一样的,都是:

输出结果
​
41
18467
6334
26500
19169
15724
11478
29358
26962
24464
​

于是我们需要引入 srand 函数

srand 函数

作用

用于给函数 rand 设置种子

不同种子下生成随机数的规则不一致

语法

需要的头文件为:stdlib.h

语法示例
​
#include<stdlib.h>

int main()
{
    srand(unsigned int);//无符号的整型
    int a = rand();
    return 0;
}

​

示例

示例
​
#include<stdio.h>
#include<stdlib.h>

int main()
{
    srand(10);//将随机数种子设为 10
    int i = 0;
    for (; i < 10; i++)//一个循环 10 次打印“随机值”的 for 语句
    {
        int a = rand();
        printf("%d\n", a);
    }


    return 0;
}

​

我们将最开始的实例加上 srand 后发现,得到的”随机数“确实不一样了:

输出结果
​
71
16899
3272
13694
13697
18296
6722
3012
11726
1899
​

但是如果生成随机数的种子不变,每次运行程序后生成的顺序仍然一样

也就是说我们需要用 srand 函数给 rand 函数生成一个随机数作为种子

我们需要生成一个随机数,但生成一个随机数需要一个随机数,所以我们要生成一个随机数作为随机数用来生成随机数(bushi

那这个问题该怎么解决呢?

time 函数

作用

获取当前时间戳

时间戳是什么?

以下来自百度百科:

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

也就是说时间戳是在不断变化的

语法

需要的头文件为:time.h

语法示例
​
time(指针);

​

示例

示例
​
#include<stdio.h>
#include<time.h>

int main()
{
    int a = time(NULL);//给 time 函数传递一个空指针
    printf("%d",a);
    
    return 0;
}

​

当每次运行以上程序后我们发现:打印出的值在不断增加

于是我们就可以用时间戳作为生成随机数的种子

实现完全随机

原理

正如上文所说:用时间戳作为生成随机数的种子

一个不当的实例

示例
​
#include<Windows.h>//Sleep 函数的头文件
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int b = 0;
    while (1)
    {
        unsigned int seed = time(NULL);//定义局部变量 seed,并将时间戳赋值给 seed
        
        srand(seed);//设置随机数种子
        
        b = rand();//获取随机数
        
        printf("%d\n", b);//打印出获取的随机数
        
        Sleep(1000);//暂停 1000ms ,也就是暂停 1s
    }

    return 0;
}

​

在这里我们无需过多关注 Sleep 函数和 Windows.h

以上程序运行后在屏幕上打印出的数字呈现某种连续性:

输出结果
​
29772
29775
29779
29782
29785
29788
29792
29795
29798
29801
29805
29808
...
​

这是由于:

以上程序将设置随机数种子的部分放在了循环内,

导致每次设置随机数种子后只打印该种子下的第一个随机数,

随后又重新设置种子

于是,我们得出结论:在需要生成随机数时,设置随机数种子的部分在整个程序中最好只运行一次

对于以上实例,我们只要将设置随机数种子的部分放至循环体外部即可

正确的实例

将设置随机数种子的部分放在循环体外,使得运行一次程序只设置一次种子

示例
​
#include<Windows.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
    unsigned int seed = time(NULL);
    srand(seed);//将设置随机数种子的部分放在循环体外,使得运行一次程序只设置一次种子
    int b = 0;
    while (1)
    {
        b = rand();
        
        printf("%d\n", b);
        
        Sleep(1000);
    }

    return 0;
}

​

某次运行结果:

运行结果
​
30846
14300
24092
15809
26965
513
13552
30653
25913
24850
11981
5943
26837
5208
11753
...

​

应用

这种方法通常在写一些小游戏比如扫雷、三子棋(井字棋)、猜数游戏等。

在实际应用中,如果不需要生成太大的数字,可以对其范围加以限制:

示例
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
	srand((unsigned int)time(NULL));
	int max = 20;
	int min = 10;

	int a = rand() % (max - min + 1) + min;

printf("%d\n", a);

	return 0;
}

rand() % (max - min + 1)会将范围限制在 [0,max-min]

上式再加 min 后范围变为 [min,max]

都看到这了,不考虑点点关注什么的......

如果你对上面提到的几个小游戏感兴趣,那么我后面也会出相关的文章教程哦~

所以现在就______我,防止以后找不到

(疯狂暗示)

posted on 2024-10-02 09:28  BLZ_dL  阅读(43)  评论(0)    收藏  举报