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以内。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(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函数生成随机数

    目录 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

  • 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语言文件操作中 fgets与fputs 函数详解

    C语言文件操作中 fgets.fputs 函数详解 先给出api fgets 语法: #include <stdio.h> char *fgets( char *str, int num, FILE *stream ); 函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中. fgets()在到达行末时停止,在这种情况下,str(字符串)将会被一个新行符结束. 如果fgets()达到[num - 1]个字符或者遇到EOF, str(字符串)将会以nu

  • R语言学习笔记之lm函数详解

    在使用lm函数做一元线性回归时,发现lm(y~x+1)和lm(y~x)的结果是一致的,一直没找到两者之间的区别,经过大神们的讨论和测试,才发现其中的差别,测试如下: ------------------------------------------------------------- ------------------------------------------------------------- 结果可以发现,两者的结果是一样的,并无区别,但是若改为lm(y~x-1)就能看出+1和

  • R语言函数详解及实例用法

    函数是一组组合在一起以执行特定任务的语句. R 语言具有大量内置函数,用户可以创建自己的函数. 在R语言中,函数是一个对象,因此R语言解释器能够将控制传递给函数,以及函数完成动作所需的参数. 该函数依次执行其任务并将控制返回到解释器以及可以存储在其他对象中的任何结果. 函数定义 使用关键字函数创建 R 语言的函数. R 语言的函数定义的基本语法如下 function_name <- function(arg_1, arg_2, ...) { Function body } 函数组件 函数的不同部

  • C语言lseek()函数详解

     头文件: #include <sys/types.h> #include <unistd.h> 函数原型: off_t lseek(int fd, off_t offset, int whence);//打开一个文件的下一次读写的开始位置 参数: fd 表示要操作的文件描述符 offset是相对于whence(基准)的偏移量 whence 可以是SEEK_SET(文件指针开始),SEEK_CUR(文件指针当前位置) ,SEEK_END为文件指针尾 返回值: 文件读写指针距文件开头

  • 关于C语言qsort函数详解

    目录 C语言qsort函数详解 一.qsort函数是什么 二.使用qsort排序-以升序为例 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒泡排序思想模拟实现qsort函数 1.什么是冒泡排序 2.冒泡排序代码 3. 使用冒泡排序思想模拟实现qsort函数 C语言qsort函数详解 一.qsort函数是什么 我们可以使用  搜索库函数网址或者MSDN软件进行查找. qsort()函数:快速排序的函数  -引用stdlib.h头文件 参

  • C语言 模拟实现memcpy与memmove函数详解

    目录 一.memcpy函数的介绍 1.函数的声明 2.函数功能与注意事项 3.函数的使用 二.模拟实现memcpy函数 1.模拟分析 2.模拟实现 三.memmove函数的介绍 1.函数的声明 2.为什么会有memmove函数 3.函数功能与注意事项 4.函数的使用 四.模拟实现memmove函数 1.模拟分析 2.模拟实现 一.memcpy函数的介绍 1.函数的声明 void * memcpy ( void * destination, const void * source, size_t

  • C语言 模拟实现strcpy与strcat函数详解

    目录 一.strcpy函数的介绍 1.函数的声明 2.函数功能与注意事项 3.函数的使用 二.模拟实现strcpy函数 1.模拟分析 2.模拟实现 三.strcat函数的介绍 1.函数的声明 2.函数功能与注意事项 3.函数的使用 四.模拟实现strcat函数 1.模拟分析 2.模拟实现 总结 这里有超详细的函数模实现分享,带大家一起来模拟实现这些函数,后续还将更新更多的函数模拟实现的文章. 一.strcpy函数的介绍 1.函数的声明 char* strcpy(char * destinatio

随机推荐