【编程经验】C语言中如何使用随机数?

C语言中如何使用随机数

随机数的使用,是不少在学C语言过程中进行一些小功能开发的同学的一个技术问题,今天我们就为大家讲解如何在C语言中使用随机数。

通常情况下,使用最多的方法的就是使用rand函数随机生成伪随机数来完成随机数的生成工作。注意这里的伪随机数并非是假的! 只不过是计算机按自己的一套理论生成,并不是”完全理想”状态下的随机数,所以是可以接受的。

函数原型为:int rand(void); 需要包含stdlib头文件,它可以生成一个0 ~RAND_MAX之间的数字,其中RAND_MAX是一个宏,VC6下笔者查看为0x7fff,建议大家亲自上机实验!

这个时候你可能会遇到下面几个问题:

Q1:为什么每次生成的数字都一样?

A1:rand函数每次生成的数字与所谓的”种子”有关,使用rand函数前需要使用srand函数进行种种子(请见后文)。如果没有调用,系统会默认给1,导致每次的随机数都一样。

Q2:为什么最大是0x7fff?

A2:这可能取决于编译器环境,笔者这里是VC6,在rand的函数中看到定义的最大值为0x7fff,如下图:

Q3:如果我想生成特定范围内的数字,该如何写呢?

A3:多多利用%求余运算符即可。如:

生成10以内的数字,可以参考rand()%10

生成1~10之间的数字,可以参考rand()%10+1

特定的,要生成a~b之间的数字,可以参考rand()%(b-a+1)+a

而更多时候,我们希望每次运行生成的数字都不相同,这个时候需要配合srand函数来解决这一问题。关于具体原因,大家可以参考rand函数与srand函数的实现细节来加以理解,代码如下:

/***

*rand.c - random number generator

*

* Copyright (c) Microsoft Corporation. All rights reserved.

*

*Purpose:

* defines rand(), srand() - random number generator

*

*******************************************************************************/

#include <cruntime.h>

#include <mtdll.h>

#include <stddef.h>

#include <stdlib.h>

/***

*void srand(seed) - seed the random number generator

*

*Purpose:

* Seeds the random number generator with the int given. Adapted from the

* BASIC random number generator.

*

*Entry:

* unsigned seed - seed to seed rand # generator with

*

*Exit:

* None.

*

*Exceptions:

*

*******************************************************************************/

void __cdecl srand (

unsigned int seed

)

{

_getptd()->_holdrand = (unsigned long)seed;

}

/***

*int rand() - returns a random number

*

*Purpose:

* returns a pseudo-random number 0 through 32767.

*

*Entry:

* None.

*

*Exit:

* Returns a pseudo-random number 0 through 32767.

*

*Exceptions:

*

*******************************************************************************/

int __cdecl rand (

void

)

{

_ptiddata ptd = _getptd();

return( ((ptd->_holdrand = ptd->_holdrand * 214013L

+ 2531011L) >> 16) & 0x7fff );

}

那么srand函数如何使用呢,先看函数原型:

void srand(unsigned seed); 只需要在rand函数使用之前,调用srand函数传入一个种子即可。但事实上传入一个数,往往产生的随时仍然固定不变。 那么较为聪明的写法目前看来只有使用系统时间作为种子最为合适,所以这里srand的参数往往传入time(NULL)参数作为获取系统当前时间作为种子,来产生不同的结果!

并注意类型一致,srand((unsigned)time(NULL)); 记得添加time.h的头文件!

测试代码如下:

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

int main()

{

int r=0;

int i=0;

srand((unsigned)time(NULL));

while(i++<10)

{

printf("r = %d\n",rand());

}

return 0;

}

大家可以自行上机测试,如发现新的问题或有其他好玩的,欢迎告知我们!

原文发布于微信公众号 - 编程范(dotcpp)

原文发表时间:2018-02-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏me的随笔

动态编程(Dynamic Programming)

这种存储计算结果以备再次使用称之为:Memoization(这个词,不知道怎么翻译好)

18720
来自专栏函数式编程语言及工具

FunDA(13)- 示范:用户自定义操作函数 - user defined tasks

   FunDA是一种函数式的编程工具,它所产生的程序是由许多功能单一的细小函数组合而成,这些函数就是用户自定义操作函数了。我们在前面曾经提过FunDA的运作原...

18780
来自专栏码匠的流水账

聊聊leaky bucket算法的实现

15310
来自专栏AI科技大本营的专栏

入门 | 海量数据处理算法总结【超详解】

作者 | Angel_Kitty ➤1. Bloom Filter 【Bloom Filter】 Bloom Filter(BF)是一种空间效率很高的随机数据...

45890
来自专栏机器之心

业界 | 谷歌开源DeepLearn.js:可实现硬件加速的机器学习JavaScript库

选自GitHub 机器之心编译 参与:蒋思源、路雪 deeplearn.js 是一个可用于机器智能并加速 WebGL 的开源 JavaScript 库。de...

39280
来自专栏WD学习记录

数据结构与算法2016-06-01

1.数据结构包括数据的逻辑结构和物理结构。数据的逻辑结构就是从具体问题抽象出来的数学模型,是为了讨论问题的方便,与数据在计算机中的具体存储没有关系。讨论数据结构...

10520
来自专栏苦逼的码农

【算法实战】生成窗口最大值数组

做算法题了,题的难度我们分为“士,尉,校,将”四个等级。这个算法题的模块是篇幅比较小的那种模块。首先是给出一道题的描述,之后我会用我的想法来做这道题,今天算是算...

13120
来自专栏小文博客

蓝桥杯 C语言省赛 习题2 格子中输出

17440
来自专栏java 成神之路

java.util.Random 实现原理

35750
来自专栏ACM算法日常

确定比赛名次(拓扑排序) - HDU 1285

这次先讲理论,因为拓扑排序在日常工作中用的并不多,甚至于很多人可能忘了计算机中存在这样一种排序。我大概的整理一下拓扑排序的定义和应用,以便看了这...

11520

扫码关注云+社区

领取腾讯云代金券