C语言随机数

1. 随机数概述

编写程序过程中,我们经常需要产生一些随机数。随机数在程序中分为两种:

  1. 真随机数:完全没有规则,无法预测接下来要产生的数。
  2. 伪随机数:通过一些预先设定好的规则产生不能简单预测的数。

当然,我们在程序中使用的随机数主要是伪随机,一般场景下,伪随机数能够满足我们大部分的场景了。本篇文章给大家介绍下,如何在C语言中产生一个伪随机数:

伪随机数在C语言中产生分为两个步骤:

  1. 设置随机数种子
  2. 获得随机数

设置随机数种子和获得随机数,我们需要使用两个函数。srand 函数rand 函数。使用这两个函数需要导入头文件:#include <stdlib.h>

2. srand 和 rand 函数用法

srand函数用来设置随机数种子,设置随机数种子时,我们一般会用时间值作为种子,这是因为时间值一直都在变化;

我们使用 time 函数获得当前时间值,使用该函数需要先导入头文件 #include <time.h>

time 函数主要用于获得从 1970 年 1 月 1日0时 0分0秒到现在经历的秒数。时间一直在变,所以该函数可作为一直在改变的随机数种子 

time 函数的原型为:

time_t time(time_t *seconds)

//seconds -- 这是指向类型为 time_t 的对象的指针,用来存储 seconds 的值
//以 time_t 对象返回当前日历时间

 time_t 在头文件 time.h 中的原型为:

#ifndef __TIME_T
#define __TIME_T     /* 避免重复定义 time_t */
typedef long     time_t;    /* 时间值time_t 为长整型的别名*/
#endif

 看下面例子:

#include <stdio.h>
#include <time.h>

int main(void)
{
	time_t seconds;
	seconds = time(NULL);
	printf("自 1970-01-01 起的小时数 = %ld\n", seconds/3600);
	seconds = time(0);//给NULL和0都会返回当前的秒数
	printf("自 1970-01-01 起的小时数 = %ld\n", seconds/3600);
	return 0;
}

 

srand函数的原型为:

void srand (unsigned int seed)

srand 函数的参数类型要求是 unsigned int,所以在使用 time 函数获取到种子后,需要将time 函数返回值进行强制转换 

在srand 设置了种子后,就可以通过 rand 函数来获取伪随机数了,rand 函数的原型如下:

int rand (void)

rand 会随机生成一个位于0~RAND_MAX 之间的整数,RAND_MAX 是 <stdlib.h> 头文件中的一个宏,它用来指明 rand() 所能返回的随机数的最大值。C语言标准并没有规定 RAND_MAX 的具体数值,只是规定它的值至少为 32767。在实际编程中,我们也不需要知道 RAND_MAX 的具体值,把它当做一个很大的数来对待即可

看下面例子:

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

int main(void)
{
  	int a;
	srand((unsigned int)time(NULL));
	a = rand();
	printf("a = %d\n", a);
	a = rand();
	printf("a = %d\n", a);
	a = rand();
	printf("a = %d\n", a);
	return 0;
}

 如果要生成一定范围的随机数,可以采用取模的方法:

int a = rand() % 10;    //产生0~9的随机数,注意10会被整除

如果要规定上下限:

int a = rand() % 51 + 13;    //产生13~63的随机数

有时候我们需要一组随机数(多个随机数),该怎么生成呢?很容易想到的一种解决方案是使用循环,每次循环都重新播种,请看下面的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int a, i;
    //使用for循环生成10个随机数
    for (i = 0; i < 10; i++) {
        srand((unsigned)time(NULL));
        a = rand();
        printf("%d ", a);
    }

    return 0;
}

此时会得出一个奇怪的现象:

 这是因为for循环运行速度非常快,在一秒之内就运行完成了,而 time() 函数得到的时间只能精确到秒,所以每次循环得到的时间都是一样的,此时需要将 srand 函数移动到 for 循环外面,结果如下:

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

int main(void)
{
	int a, i;
    //使用for循环生成10个随机数
	srand((unsigned int)time(NULL));
    for (i = 0; i < 10; i++) {
        a = rand();
        printf("%d\n", a);
    }
	return 0;
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值