C语言之随机数的生成

这篇博客主要来讲解如何生成一个随机数


C语言提供了一个函数 rand , 这个函数可以生成随机数

如下是函数的原型:

 int rand (void);

rand函数会返回一个伪随机数,在一般的编译器上,这个随机数的大小范围是0 - 32767

rand函数的使用需要包含一个头文件 stdlib.h

让我们来测试以下该函数对随机数的生成

下面两张图是两次运行的结果,我们可以发现这个函数确实生成了随机数,但是两次生成的函数却是一样的。这就是为何称其返回的是伪随机数的原因。

伪随机数只是相对随机的,而我们想要的是真正的随机数,真正的随机数应该是我们无法精准预判将要生成的数是什么。

其实,rand函数是对一个叫“种子”的基准值进行运算生成的随机数。

之所以每次程序运行产生的随机数是一样的,是因为rand函数生成随机数的默认种子是1,如果我们想要生成真正不同的随机数,那我们就需要让种子发生变化。


C语⾔中⼜提供了⼀个函数叫 srand,⽤来初始化随机数的⽣成器的

该函数的原型如下:

void srand (unsigned int seed);

程序中在调用rand函数之前先调用srand函数,通过函数srand的参数seed来设置rand函数生成随机数的时候的种子,只要种子发生变化,那么每次生成的随机数也会发生变化

所以就是给srand函数的种子是随机的,那么rand函数就能生成真正的随机值。


在程序中我们一般是使用程序的运行时间来作为种子的,为什么呢?因为时间一直在变化

在C语⾔中有⼀个函数叫 time ,可以获得这个时间

函数的原型如下:

time_t time (time_t* timer);

time函数会返回 1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒,也就是相差的秒数,所以是一直在变化的。

返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。

time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。

如果 timer 是NULL,就只返回这个时间的差值。

timer 函数返回的这个时间差也叫作 :时间戳

比如我现在写这篇博客的时候 时间戳是

time函数使用的时候需要包含头⽂件:time.h

所以如果只想让函数返回时间戳我们可以这样写:

time(NULL);

那么一切就绪,我们想真正生成一个随机数,代码就为

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	//使用time函数设置种子
	//因为srand的参数是unsigned int类型,我们将time函数的返回值类型强制转换
	srand((unsigned int)time(NULL));
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

当我们再次执行程序,我们就会发现每次运行的结果都不一样,这是真正的随机数,大功告成啦!

   


当然,精益求精嘛。

还有一些我们是可以学习到的。

那就是随机数的--范围

如果我们要生成0 - 99的随机数:

rand() %100; // 0-99

如果要⽣成1~100之间的随机数:

 rand()%100+1; // 1-100

如果要⽣成100~200的随机数

余数的范围是0 - 100,加上100后范围就是100 - 200

100 + rand()%(200-100+1)

所以我们就有一个技巧

所以如果要⽣成a~b的随机数,⽅法如下:

 a + rand()%(b-a+1)

例子:生成0 - 99的随机数

总结:

随机数的生成还是很重要的,值得好好学习。通过随机数我们可以借此生成很多随机的东西,具体可以慢慢发现哟!

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值