c语言 伪随机数程序,C语言的伪随机数

一直想好好的系统的学习一下C语言的伪随机数,今天终于逮到机会了

伪随机数

C语言中有可以产生随机数据的函数,需要添加stdlib.h和time.h头文件。首先在main函数开头加上srand(unsigned)time(NULL))。

先来介绍一下srand

头文件:

定义函数:void srand (unsigned int seed);

函数说明:srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用getpid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。

再来介绍一下time,

函数名称: time

函数原型: time_t time(time_t *timer)

函数功能: 得到机器的日历时间或者设置日历时间

函数返回: 机器日历时间

参数说明: timer=NULL时得到机器日历时间,timer=时间数值时,用于设置日历时间,time_t是一个long类型

所属文件:

因此上述的srand((unsigned)time(NULL))是利用系统时间来初始化随机种子的。

最后来介绍一下重要的一个函数rand

rand函数

头文件:

定义函数:int rand(void)

函数功能:产生随机数

函数说明:因为rand的内部实现是用线性同余法做的,它不是真的随机数,只不过是因为其周期特别长,所以,在一定的范围里可看成是随机的。rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。

返回值: 返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。且0-RAND_MAX每个数字被选中的机率是相同的。

rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。

举个例子

#include

#include

#include

int main(){

srand((unsigned)time(NULL));

for(int i=0;i<10;i++){

printf("%d ",rand());

}

return 0;

}

e46faef3910f34fcfc167799b4a1f520.png

说白了上述的随机数范围是0~32767之间,若没有设置系统时间种子,则rand默认随机种子为1,则多次运行结果都是一致的。

当然,若想要一个给定范围的随机数,则需要使用rand()%(b-a+1)+a。显然rand()%(b-a+1)的范围是[0,b-a],再加上a即为[a,b]。

举个例子([0,1]和[3,6]之间的随机数)

#include

#include

#include

int main(){

srand((unsigned)time(NULL));

for(int i=0;i<10;i++){

printf("%d ",rand()%2);

}

putchar('\n') ;

for(int i=0;i<10;i++){

printf("%d ",rand()%4+3);

}

return 0;

}

7686c3f7b128c6ce79e9608e42ca2b25.png

一般来说这个范围最大是0~32767,若想要生成超过32767的更大的随机数,则可以采用,移位或者拼凑或者用随机数除以RAND_MAX,这样就会得到一个[0,1]范围内的浮点数。只需要这个浮点数乘以范围长度(b-a+1)再加上a即可。即(int)((double)rand()/32767*(b-a+1)+a),相当于这个浮点数在[a,b]范围内的比例位置

举个例子

#include

#include

#include

int main(){

srand((unsigned)time(NULL));

for(int i=0;i<10;i++){

printf("%d ",(int)((1.0*rand()/RAND_MAX*50000+10000)));//10000~60000

}

return 0;

}

7952385b8499b1771a1417d409bf2e35.png

PS:介绍一个简单的AC技巧,在程序中一次性计算出所有需要用到的结果,然后查询直接取这些结果,典型的AC技巧有木有(●ˇ∀ˇ●)

小结

C语言的伪随机数适用范围还是挺广泛的,下次需要用起来的时候,就不需要再去找什么资料了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最大隶属度原则_模糊数学笔记:六、模糊模型识别-I(最大隶属度原则)

1、模型识别的问题提出模型识别&#xff0c;通俗地理解即是对一个类别未知的对象进行归类&#xff08;或者叫分类&#xff09;。这里与聚类不同的是&#xff0c;聚类实际上是要区分出已有的样本哪些属于同一类&#xff0c;但并没有参考标准。而识别则事先有参考的标准&#xff…

C语言经典题

C 库函数 - tanh()描述C 库函数 double tanh(double x) 返回 x 的双曲正切。声明下面是 tanh() 函数的声明。double tanh(double x)参数x -- 浮点值。返回值该函数返回 x 的双曲正切。实例下面的实例演示了 tanh() 函数的用法。#include#include int main (){ double x, ret;…

C++11的模板改进

C11关于模板有一些细节的改进&#xff1a;模板的右尖括号模板的别名函数模板的默认模板参数模板的右尖括号C11之前是不允许两个右尖括号出现的&#xff0c;会被认为是右移操作符&#xff0c;所以需要中间加个空格进行分割&#xff0c;避免发生编译错误。int main() {std::vecto…

android 第三方圆弧进度条,android 可配置的圆弧进度条

Arc ProgressBar Configurable 圆弧环形进度条DEMOAttributesnameformatdescriptionborderWidthinteger圆弧边框的宽度progressStyletick/arc进度条类型&#xff0c;tick 为带刻度的radiusinteger半径arcbgColorcolor圆弧的边框背景degreeinteger弧度&#xff0c;设置为 0 即为…

C++定时器的实现之格式修订版

个人认为一个完备的定时器需要有如下功能&#xff1a;在某一时间点执行某一任务在某段时间后执行某一任务重复执行某一任务N次&#xff0c;任务间隔时间T那么如何实现定时器呢&#xff1f;下面是我自己实现的定时器逻辑&#xff0c;源码链接最后会附上。定时器中主要的数据结构…

java 性能调优_Java性能调优调查结果(第四部分)

java 性能调优这是本系列中的最后一篇文章&#xff0c;我们将分析我们在2014年10月进行的Java Performance Tuning Survey的结果。如果您尚未阅读第一篇文章&#xff0c;建议您首先阅读以下内容&#xff1a; 性能问题的频率和严重性 最受欢迎的监控解决方案 查找根本原因的工…

Android接入热敏打印机,Android 关于佳博和汉印蓝牙热敏打印机开发

接上篇文章Android之BLE(低功耗)蓝牙开发&#xff0c;本篇文章针对上篇博文中提出的两款打印机的开发流程进行记录。首先不管时佳博打印机还是汉印打印机&#xff0c;都是先对他们各自的lib进行导入&#xff0c;如图&#xff1a;导入lib之后&#xff0c;一定要记得进行sync pro…

C 桥接模式 - 开关和电器

桥接模式&#xff08;Bridge Pattern&#xff09;是将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。1模式结构UML 结构图&#xff1a;Abstraction&#xff08;抽象类&#xff09;&#xff1a;用于定义抽象类的接口&#xff0c;并且维护一个指向 Implementor…

javafx显示image_如何摆脱JavaFX中的重点突出显示

javafx显示image今天&#xff0c;有人问我是否知道摆脱JavaFX控件&#xff08;分别是按钮&#xff09;的焦点突出的方法&#xff1a; 有关此问题的大多数文章和提示建议添加&#xff1a; .button:focused {-fx-focus-color: transparent; }但是使用这种样式&#xff0c;仍然…

C语言没有引用,只有指针

这个问题是昨晚上有同学在知识星球提问&#xff0c;但是因为前两天一直在出差&#xff0c;比较累&#xff0c;没认真回答&#xff0c;今天打球回来&#xff0c;就把这个事情解决了。我想说的已经在题目说明的很清楚了&#xff0c;C语言是没有引用的&#xff0c;引用是在C 里面才…

C/C 代码规范注释有哪些讲究?

如果领导给你一个项目的源码让你阅读&#xff0c;并理解重构代码&#xff0c;但里面一句注释都没有&#xff0c;我想这肯定是之前同事“删库跑路”了。看一份源码什么很重要&#xff1f;除了各种代码规范之外&#xff0c;还有一个比较重要的就是注释。注释虽然写起来很痛苦, 但…

qq互联android sdk,qq互联.Android

导读&#xff1a;2.2调用示例&#xff0c;这里以发送文字微博接口的调用为例例&#xff0c;来说明通过requestAsync调用兼容接口的方法&#xff1a;&#xff0c;在上面的调用中&#xff0c;调用获取用户信息接口的示例代码如下&#xff1a;&#xff0c;调用发送带图微博接口的&…

C 流插入和流提取运算符的重载

<<运算符的重载C 在输出内容时&#xff0c;最常用的方式&#xff1a;std::cout << 1 <<"hello";提出问题&#xff1a;那这条语句为什么能成立呢&#xff1f;cout 是什么&#xff1f;为什么 << 运算符能用在 cout 上呢&#xff1f;原因&#…

primefaces_使用Bean验证扩展PrimeFaces CSV

primefaces你们中有些人已经知道我和我的合著者Mertalışkan正在研究PrimeFaces Cookbook的2.版。 Packt Publishing允许我从新章节“客户端验证”的一个食谱中摘录一小部分摘录。 这将有助于使读者知道这本书的内容。 在此博客文章中&#xff0c;我想讨论使用Bean验证扩展的P…

函数指针,指针函数,函数指针数组

这是一个群友发的笔试题目&#xff0c;里面涉及的东西也比较有意思。直接看代码void (*f[])(char *)这个是个什么东西&#xff1f;我们先看看下面的东西函数指针和指针函数的定义我们看个代码int *func(int a,int b)我们之前说过运算符的优先级&#xff0c;「 * 」 的优先级低…

畅享10e会有鸿蒙吗,功能虽小作用很大 华为畅享10e隐藏功能大揭秘

原标题&#xff1a;功能虽小作用很大 华为畅享10e隐藏功能大揭秘如今使用手机游戏、观影、听音乐、刷短视频、拍照等多种多样的娱乐方式,充斥着年轻人生活之中。作为年轻用户娱乐的重要载体,现在的手机不仅硬件强大,在软件功能上方面也取得了突破性进展,不仅仅是高端机,甚至千元…

C this指针的理解和作用

C 程序到 C 程序的翻译 要想理解 C 的 this 指针&#xff0c;我们可以先把下面的 C 代码转换成 C 代码&#xff1a;C 语言是没有类定义 class 关键词&#xff0c;但是有跟 class 类似的定义&#xff0c;那就是 struct 结构体。m_price 变量是 Car 类的成员变量&#xff0c;那…

C++ inline 函数简介

1.inline 函数简介inline 函数由 inline 关键字定义&#xff0c;引入 inline 函数的主要原因是用它替代 C 中复杂易错不易维护的宏函数。2.编译器对 inline 函数的处理办法编译器在编译阶段完成对 inline 函数的处理&#xff0c;即对 inline 函数的调用替换为函数的本体。但 in…

intellij ide_UltraESB的首选IDE – IntelliJ IDEA

intellij ide在AdroitLogic&#xff0c;我们长期以来一直在使用IntelliJ IDEA进行开发。 它是Java和相关语言/技术的最佳IDE&#xff08;它可能也是许多其他语言的选择&#xff0c;但我的经验主要是Java和相关技术&#xff09;。 Groovy和IDEA的Grails的集成很棒。 通过自动发…

C++抽象类

概念在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。抽象类往往用来表征对问题领域进行分…