C语言中随机数rand()函数详解

  在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数。在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下:

  int __cdecl rand(void);

  rand函数没有参数,它的返回值就是随机数。下面通过一个简单的例子来测试一下rand函数。

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

int main(int argc, char** argv) {

	int i;

	i = rand();

	printf("%d",i);
	return 0;
}

  直接调用rand函数产生一个随机数,并打印出来。运行结果如下:

  此时生成的随机数为41,下面多生产几个随机数看看。

  通过一个for循环产生10个随机数,通过打印的结果可以看到第一个随机数是41,其他后面9个数据都比较大。将随机次数改为15,在测试一次。

  此时产生了15个随机数,但是通过和产生10个随机数相比可以发现,这次产生的随机数前面10个数字和上次一模一样。将程序重新运行之后,产生的随机数和上一次也一模一样。

  这时什么原因呢?难道随机数生成函数rand出现了bug?

  实际上通过rand函数产生的随机数是伪随机数,它是根据一个数值然后通过公式计算出来一个值,将计算的结果作为随机数返回。这个固定参考的数值就被称为“种子”,每次计算机启动时就会生成一个种子,然后在以后运行的过程中种子就不会在发生变化了。所以每次执行rnad函数的时候,它参考值种子值都是固定的,因此每次生成的随机数也就是固定的。如果要每次生成的随机数不同,那么每次产生随机数之前就需要改变种子的值。

  种子的值是由srand函数来产生的,函数原型如下:

  void __cdecl srand(unsigned int _Seed);

  函数没有返回值,它的参数就是需要设置的种子值。将修改种子的函数也添加到代码中。

  将种子值设置为10,然后生成10个随机数。

  将种子值设置为20,然后生成10个随机数。

  可以看到当种子的值发生变化后,生成的随机数也就发生了变化。如果程序中需要重复的使用随机的话,那么随机种子的值就不能时一个定值,它必须时刻发生变化,这么生成的随机数才能时刻发生变化。在系统中时刻发生变化的数字,首先能想到的就是时间,因为时间实时都在发生变化,不可能出现同样的值。

  那么就可以将获取系统的时间,然后作为随机数的种子。时间函数time原型如下:

__CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time64(_Time); }

  调用time函数后,它就会返回当前系统的时间的秒数,它的参数可以直接设置为NULL。

  调用time函数时,需要添加头文件time.h。将时间值作为随机种子,这样每次生成的随机数就会不同,但是通过上面的输出结果可以看到,每次生成的随机数大小都变化很大,如果要将随机数的大小控制在一定范围内要怎么办呢?

  要控制数字的范围,那么可以使用数学的取余数运算,如果要将生成的数字控制在10以内,那么对生成的数字除以10,然后取余数。这样余数的大小就不会超过10。

  这里对生成的随机数除以100取余,这样最后产生的随机数都会在100以内。

到此这篇关于C语言中随机数rand()函数详解的文章就介绍到这了,更多相关C语言rand()函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C语言中rand函数的使用

    前言 我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的rand函数,生成的也是伪随机数. c语言之rand函数的使用 1.写入头文件 #include <stdlib.h> #include <stdio.h> #include <time.h> 2.变量的定义 void main( void ) { int i,k; 3.sran

  • C语言随机数生成教程(rand和srand用法)

    在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机数,它的用法为: int rand (void); void 表示不需要传递参数. C语言中还有一个 random() 函数可以获取随机数,但是 random() 不是标准函数,不能在 VC/VS 等编译器通过,所以比较少用. rand() 会随机生成一个位于 0 ~ RAND_MAX 之间的整数. RAN

  • C语言中的rand()和rand_r()详解

    目录 背景 rand()和rand_r()的区别 rand() rand_r() 总结 背景 最近在学<并行程序设计导论>这门课,在做使用Pthreads并行化蒙特卡洛法估计 π \pi π的实验时遇到了一个问题,使用多线程反而要比单线程要慢很多,输出如下所示 可以看到,使用一个线程时程序运行只需要2.89031秒,但是使用两个线程时运行时间竟然达到了9.14698秒. 最终发现了问题所在:每个线程在执行下面的函数时,生成随机数使用了rand()函数,就是这个函数的使用才导致多线程运行时所需要

  • Java和c语言随机数Random代码详细

    目录 一.随机数的创建步骤 1.导包 2.创建对象 3.数据接收 二.Java随机数游戏 三. c语言的猜数字 一.随机数的创建步骤 1.导包 所谓导包就是在Java中已经定义好的文件,我们直接引用过来即可 随机数导包: import  java.util.Random; 2.创建对象 其实创建对象就是在开辟内存空间 随机数创建对象: Random d=new Random();  其中d是任意起的变量名,其余形式格式固定 3.数据接收 数据接收就是创建一个变量去接受产生的随机数. 接受随机数:

  • C语言使用rand函数生成随机数

    目录 rand()函数 函数原型: 初步使用 生成0到99的随机数 再次运行  发现问题 查看rand()函数的官方文档 srand()函数 srand的官方介绍 初步使用srand() 再次运行 发现问题 解决问题:time函数 时间戳 rand()函数 生成随机数使用rand()函数 函数原型: int rand (void); 头文件<stdlib.h> 初步使用  目前该"随机数"貌似成功生成 生成0到99的随机数 再次运行  发现问题 大家有木有发现其实这三次的运

  • C语言中随机数rand()函数详解

      在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void);   rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(

  • C语言的随机数rand()函数详解

    在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void); rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(); p

  • javascript中Array()数组函数详解

    在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活.强大,不像是Java等强类型高级语言数组只能存放同一类型或其子类型元素,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改. Array()是一个用来构建数组的内建构造器函数.数组主要由如下三种创建方式: array = new Array() array =

  • python中的 zip函数详解及用法举例

    python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表).若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同.利用*号操作符,可以将list unzip(解压),看下面的例子就明白了: 示例1 x = [1, 2, 3] y = [4, 5, 6] z = [7, 8, 9] x

  • R语言中因子相关知识点详解

    因子是用于对数据进行分类并将其存储为级别的数据对象. 它们可以存储字符串和整数. 它们在具有有限数量的唯一值的列中很有用. 像"男性","女性"和True,False等.它们在统计建模的数据分析中很有用. 使用factor()函数通过将向量作为输入创建因子. 例 # Create a vector as input. data <- c("East","West","East","North

  • C语言 模拟实现strlen函数详解

    目录 前言 一.strlen函数的介绍 1.strlen函数的声明 2.strlen函数的简单运用 3.注意事项 二.三种实现strlen函数的方法 1.计数器的方法 2.递归方法 3.指针-指针的方法 前言 用C语言模拟实现strlen函数,我这里有三种方法,快来看看跟你用的方法是否是一样. 一.strlen函数的介绍 1.strlen函数的声明 size_t strlen ( const char * str ): 这里函数的返回值为无符号整形(size_t),传入的是一个常量char*类型

  • C语言中的文件操作详解

    目录 1.为什么使用文件 2.什么是文件 2.1程序文件 2.2数据文件 2.3文件名 3.文件的打开和关闭 3.1文件指针 3.2文件的打开和关闭 4.文件的顺序读写 5.文件的随机读写 5.1fseek 5.2ftell 5.3rewind 6.文本文件和二进制文件 7.文件读取结束的判定 7.1被错误使用的feof 8.文件缓冲区 结论 1.为什么使用文件 在学习结构体时,写了一个简易的通讯录的程序,当程序运行起来的时候,可以在通讯录中增加和删除数据,此时数据是存放在内存当中的,当程序退出

  • Go语言中基本数据类型的相互转换详解

    目录 基本数据类型的相互转换 基本语法 小知识 基本数据类型和string的转换 方法一 方法二 string和基本数据类型转换 基本数据类型的相互转换 Go在不同类型的变量之间赋值时需要显示转换,不能自动转换 基本语法 表达式 T(v): 将值v转换成类型T T就是数据类型: int32, int64, float32... v就是需要转换的变量 1.不考虑溢出的情况下,类型转换不会改变数值大小 var i int8 = 100 var n int32 = int32(i) fmt.Print

  • COM组件中调用JavaScript函数详解及实例

    COM组件中调用JavaScript函数详解及实例 要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度.这就要求使用回调函数,设其名称为scriptCallbackFunc.实现这个技术很简单: 1 .组件方(C++) 组件A 的方法在IDL中定义: [id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional

  • 对Python3中的input函数详解

    下面介绍python3中的input函数及其在python2及pyhton3中的不同. python3中的ininput函数,首先利用help(input)函数查看函数信息: 以上信息说明input函数在python中是一个内建函数,其从标准输入中读入一个字符串,并自动忽略换行符. 也就是说所有形式的输入按字符串处理,如果想要得到其他类型的数据进行强制类型转化.默认情况下没有 提示字符串(prompt  string),在给定提示字符串下,会在读入标准输入前标准输出提示字符串.如果遇 文件结束符

随机推荐