C语言 实现随机数的生成

rand

        C语言提供了一个rand函数,这个函数是可以随机生成的,但生成范围在 0-RAND_MAX 之间,这个大小是依赖编译器实现的,但大多数编译器到32767,rand 函数使用的头文件是:stdlib.h 如果我们对它进行生成打印到屏幕,我们会发现第一次运行是随机数,但两次运行的结果是一样的。所以 rand函数生成的随机数是伪随机数。 第一次打印是随机的,他是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。第二次打印也是找这个种子。

#include<stdio.h>
#include <stdlib.h>
int main()
{
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

srand

        C语言中有个 srand 函数,他是用来初始化随机数的生成器,也就是在打印之后实现对"种子“的初始化,当“种子”随机的时候便可以达到让 rand 生成随机数。我们以程序为例子,在 strand(x) 如果x是随机的那么rand生成的数也是随机的。x不同所生成的随机数也是不同的 这就是说在生成随机数的时候在生成一个随机数。这是就矛盾了。因为我们要想实现随机数还要解决 srand()函数随机值的问题。怎么解决呢?是不是只需要找到一个可以让x变换的数不见可以了。

#include<stdio.h>
#include <stdlib.h>
int main()
{
	srand(3);
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

time

        time()函数可以获得时间。而时间是随时随地在变换的,时间在变  srand在变 srand在变 ”种子也在变“,后面生成的数字就不一样了。所以我们可不可以尝试用这个函数来实现x的值的变换呢。

        time函数返回的是时间戳,时间戳:是从1970年1月1日开始所经过的秒数,不考虑闰秒。而这个数字就可以换算成时间。也就是返回当前日历的时间。

        time函数的参数是一个指针变量,如果不想用这个值,就向它传一个空指针。time(NULL)  又因为这个函数返回的类型是 time_t 但是srand函数要的是 unsigned int 类型的函数,所以我们要强制类型转换一下。unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数。time函数的使用要包含头文件   #include  <time.h>

#include<stdio.h>
#include <stdlib.h>
int main()
{
	srand((unsigned int)time(NULL));
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

这时候我们就已经知道了随机数生成的方法,那么如果我们要生成是随机数的1-100 或者0-100 或者随机两个数怎么输入呢?

我们知道,当我们%10的时候余数是一个一位数,%100的时候余数是一个两位数。所以当上面需要 0-99的时候  rand()%100   即可,当我们需要 100 - 200 以内的随机数的时候,  100 + rand()% 100 + 1     以此类推我们可以得出,当我们需要一个 a - b的随机数的时候   a + rand() % (b - a) + 1 。如需要一个 99 - 233 之内的数字  99 + rand() %(233-99+1)    233-99=134  134+1=135

我们可以生成一个代码来运行看一下,135余数的范围是 0-134 ,又因为 0+99=99 而 134+99=233 所以我们的取值范围就是 99-233 因此我们可以得到一个公式当我们需要一个 a - b的随机数的时候   a + rand() % (b - a + 1) 。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值