目录
大家好,今天为大家带来在C语言中该如何生成随机数的相关知识
随机数是编程中常见的基础需求,C 语言本身提供了标准库来实现随机数生成。
但很多人只知道用 rand() ,却不清楚种子、范围控制等细节,导致写出的随机数不符合预期。
本文详细讲解 C 语言随机数的原理、用法与常见坑。
1.rand函数


要使用rand函数必须包含头文件<stdlib.h>
它会返回随机一个0~RAND_MAX(32767)中的值

可以看到它会返回一个随机数给我们

但是我们再次运行程序时,我们发现两次运行生成的随机数相同

我们如果再深入调查一下就能发现rand函数并不是真正的生成随机数,而是通过某种算法得到的“随机数”,是伪随机数。
在这个网站我们知道rand - C++ 参考
https://legacy.cplusplus.com/reference/cstdlib/rand/?kw=rand

rand 函数是对一个叫 “种子” 的基准值进行运算生成的随机数。
之所以前面每次运行程序产生的随机数序列是一样的,那是因为 rand 函数生成随机数的默认种子是 1。
如果要生成不同的随机数,就要改变种子的值。
那怎么改变种子呢?这就要使用srand函数了
2.srand函数

这个函数要给它传一个无符号整数来充当种子,我们也能知道rand 函数生成随机数的默认种子是 1。


这时就需要让传给 srand 函数的参数是随机的就行了。
但我们就疑惑了,我们本来就要让系统给我生成一个随机数,带生成一个随机数就需要一个随机数,这不是悖论吗?
其实我们只需要传给它一个不停变化的值就行了,这时就需要 time 函数
3.time函数

它会将时间戳返回到 time_t 指针指向的数据中,如果是空指针(NULL)它会将时间戳已返回值的形式带回来

3.1时间戳

就是如今距1970年1月1日过了多少秒
3.2 time_t 是什么?
time_t本质上就是32位或64位的整型类型

这样由于时间在不停变化,传给 srand 函数的参数就不停变化,这样“ 种子 ”就不停变化了
4.随机数的生成
综上我们就可以真正得到随机数了


5.如何控制随机数的范围
如果我们要生成1~100之间的随机数该如何做呢?
我们让 rand 函数的返回值" %100 "就能得到0~99的值再" +1 "就行了

那么 100~1000 呢?
我们可以先确定生成0~900的数,再" +100 "
即
printf("%d\n", 100 + rand() % 901);
这样我们要求生成a~b之间的随机值就是
printf("%d\n", a + rand() % (b - a + 1));
//rand() % (b - a + 1)得到0~b - a之间的数,再加上a得到a~b之间的随机值
6.猜数字游戏(100~200之间)
我们如果了解了随机数的生成方式就可以写一个小游戏——猜数字游戏
6.1菜单
void menu(void)
{
printf("********************\n");
printf("***** 1.Paly *****\n");
printf("***** 0.Exit *****\n");
printf("********************\n");
}
6.2游戏
void game(int n)
{
if (!n)//判断用户是否游玩
return;
else
{
srand((size_t)time(NULL));
int target = 100 + rand() % 101;//生成随机数
int input = 0;//记录用户猜的数字
while (input != target)
{
printf("请选择你要猜的数字\n");
scanf("%d", &input);
if (input > target)
printf("猜大了\n");
else if (input < target)
printf("猜小了\n");
else
printf("恭喜你,您猜对了!\n");
}
}
}

6.3主函数部分
int main()
{
int input = 0;
do
{
menu();
printf("请选择操作->\n");
scanf("%d", &input);
game(input);
} while (input);
return 0;
}
以上就是全部内容,感谢阅读,希望能够帮到你,也欢迎大家指错及补充
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/lunar_coder/article/details/157971508



