该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

在C语言函数库中包含了一个产生随机数的函数:

int rand( void );

在函数库中对这个函数的说明是:

The rand function returns a pseudorandom integer in the range

0 to RAND_MAX. Use the srand function to seed the pseudorandom

-number generator before calling rand.

而在C语言函数库中是这样定义RAND_MAX的:

/* Maximum value returned by "rand" function

*/

#define RAND_MAX 0x7FFF

所以,函数int rand( void );返回的是一个界于0~32767(0x7FFF)之

间的伪随机数,包括0和32767。注意,这里产生的是伪随机数,不是真正意

义上的随机数,看下面的程序:

#include "stdlib.h"

#include "stdio.h"

void main( void )

{

/* Display a number. */

printf( " %6d\n", rand() );

getchar();

}

程序运行的结果是:

346

多次运行这个程序,发现每次产生的结果都是346(不同的机器可能产生

的结果不一样),这就是所谓的伪随机数。伪随机数是通过一个公式来运算

出来的,所以,每次产生的伪随机数都一样。那么,如何才能产生真正意义

上的随机数呢?这就有一个随机种子的问题。在C语言标准函数库中,有这

么一个函数:

void srand( unsigned int seed );

在《The c programming language》中对这个函数是这样描述的:

srand uses seed(函数变量声明中的seed) as the seed(随机函数中种子

的意思) for a new sequence of pseudo-random numbers. The

initial seed is 1.

所以,要产生真正意义上的随机数,那么就要求每次提供的种子不一样,一

般情况下,都设置时间为随机函数的种子。看下面的一段程序:

/* RAND.C: This program seeds the random-number generator

* with the time, then displays 10 random integers.

*/

#include "stdlib.h"

#include "stdio.h"

#include "time.h"

void main( void )

{

int i;

/* Seed the random-number generator with current time so that

the numbers will be different every time we run.

将当前时间设置成随机函数的种子,所以每次产生的数都不一样

*/

srand( (unsigned)time( NULL ) );

/* Display 10 numbers. */

for( i = 0; i

printf( “ %6d\n”, rand() );

}

Output

6929

8026

21987

30734

20587

6699

22034

25051

7988

10104

每次运行这个程序,产生的随机数都不一样,这样就达到了随机数的要求了

注意,rand这个函数产生的随机数的范围是0~32767,如果要产生100以内

的随机数怎么办呢?在标准C语言库中并没有定义产生给定范围的随机数的

函数。其实,要产生给定范围的随机数,只要做一个取余(%)运算就可以了

。下面是一个产生10以内随机数的函数:

#include "stdlib.h"

#include "stdio.h"

#include "time.h"

int rand2( void );

void main( void )

{

int i;

/* Seed the random-number generator with current time so that

· the numbers will be different every time we run.

*/

srand( (unsigned)time( NULL ) );

/* Display 10 numbers:0~9 */

for( i = 0; i

printf( " %6d\n", rand2() );

getchar();

}

int rand2( void )

{

return rand() % 10 ;

}

运行结果:

2

5

7

9

0

1

3

5

8

3

在这个程序中,我自己写了一个函数rand2(),来产生10以内的随机数,其

实,打开标准库中的头文件 Stdlib.h 就会发现有这样的一条语句:

#define random(num) (rand() % (num))

上面的这行代码是为了方便产生给定范围的随机数的,思路也是采用取余的

方法,所以上面的程序也可以改成:

#include "stdlib.h"

#include "stdio.h"

c语言中随机选择函数,怎样让c语言中的随机函数真正随机?相关推荐

  1. 分类树/装袋法/随机森林算法的R语言实现

    原文首发于简书于[2018.06.12] 本文是我自己动手用R语言写的实现分类树的代码,以及在此基础上写的袋装法(bagging)和随机森林(random forest)的算法实现.全文的结构是: 分 ...

  2. c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配

    #include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...

  3. 先马后看!详解线性回归、朴素贝叶斯、随机森林在R和Python中的实现应用!(附代码)...

    来源| analyticsvidhya 编译| 火火酱,责编| Carol 出品 | AI科技大本营(ID:rgznai100) 谷歌的自动驾驶汽车和机器人得到了媒体的广泛关注,但是公司真正的未来是在 ...

  4. c语言中有关随机数的程序,C语言中随机数相关问题

    用C语言产生随机数重要用到rand函数.srand函数.及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明. int rand(void);//生成一个随机数 voidsrand ...

  5. 为什么c语言加法错误,分数的加减法——C语言初学者代码中的常见错误与瑕疵(12)...

    重构 题目的修正 我抛弃了原题中"其中a, b, c, d是一个0-9的整数"这样的前提条件,因为这种限制毫无必要.只假设a, b, c, d是十进制整数形式的字符序列. 我也不清 ...

  6. c语言mac地址加冒号,如何通过在Excel中添加冒号来格式化单元格中的mac地址?

    如何通过在Excel中添加冒号来格式化单元格中的mac地址? 假设您收到一个包含数字列表的工作表,现在您需要通过添加冒号将所有这些数字格式设置为mac地址,如下面的屏幕截图所示. 您能做什么来实现呢? ...

  7. c语言中占位符,Java C# C语言中的占位符

    一般拼接一段字符串在编程中是很常见的事,下面简单做个总结: 什么是占位符?占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号. 1.Java中处理方法: package com.amos; ...

  8. c语言中初始化的主要作用,C语言初始化——栈的初始化

    栈是一种具有后进先出性质的数据组织方式,也就是说后存放的先取出,先存放的后取出.栈底是第一个进栈的数据所处的位置,栈顶是最后一个进栈的数据所处的位置. 1.满栈与空栈 根据SP指针指向的位置,栈可以分 ...

  9. c语言指针很危险,浅谈C语言中指针使用不当的危险性.doc

    浅谈C语言中指针使用不当的危险性.doc 第 19 卷 Vol . 19 第 2 期 No . 2 洛阳师专学报 Journal of Luoyang Teachers College 2000 年 ...

最新文章

  1. android8.1内核编译,Android8.1.0安卓源码编译
  2. ilm 和dlm差异_电力通信系统--加密芯片.pdf
  3. jdk1.8hashmap为什么对hash进行了一次扰动处理
  4. mescroll上拉加载的实现
  5. list.php tid 1,DedeCMS栏目用目录名个性化伪静态
  6. 项目成功的关键是在投资最少的时候找出错误
  7. MapXtreme绿色部署
  8. xp系统怎么进pe修改计算机名,U盘装xp_教您怎样用u盘装xp系统
  9. 地面监视雷达系统的设计与试验
  10. Setup Factory 卸载时出现Invalid Start mode :archive filename 无法卸载问题
  11. word中批量修改图片大小的两个方法
  12. 【Excel学习笔记11】计数、求和、平均值函数,通配符
  13. win10启动项_win10系统开机启动项的设置教程
  14. 搞笑--为毛我顶多是个包工头
  15. python原始数据是什么_荐Python种MNE库模拟原始脑电数据
  16. 外卖红包领取公众号简单搭建
  17. 项目环境搭建,数据库,以及Swagger2介绍(二)
  18. 高洛峰2015年新版视频发布
  19. 【多目标进化优化】NSGAII 算法原理与代码实现
  20. 虚拟机下载安装Centos7(新手详解)

热门文章

  1. 硬盘驱动器是如何工作的?
  2. 廖雪峰 python_40岁老男人从0开始学python实录(第1天)
  3. python是全栈_Python全栈之路-3-字符串
  4. php7.2 mysql 教程_如何在PHP7中扩展mysql,先安装php7.2。后安装mysql
  5. mongodb索引生成HTML页面,MongoDB高级索引
  6. java 反射 慢在那里_Java 反射到底慢在哪?
  7. linux和windows测评,Windows Server 2016 与 Linux同台PK
  8. C 如何在函数中返回一个数组
  9. Java天使之恋攻略,跑跑卡丁车手游天使之恋怎么得 天使之恋获取攻略[多图]
  10. 【js细节剖析】通过=操作符为对象添加新属性时,结果会受到原型链上的同名属性影响...