C语言中随机数的生成
刚好在找这方面的资料,看到了一片不错的,就全文转过来了,省的我以后再找找不到。
在C语言中,可以通过rand函数得到一个“伪随机数”。这个数是一个整数,其值大于等于0且小于等于RAND_MAX。rand函数和常量RAND_MAX都定义在库stdlib.h之中,这意味着必须在头文件中包含库stdlib.h才能使用rand函数和常量RAND_MAX。
rand函数声明为:
int rand(void)
//代码示例 start
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d %d\n", rand(), rand());
}
//代码示例 end
编译运行以上代码,将在屏幕显示两个随机数。但多次运行这个程序,你会发现每次程序启动后生成的两个随机数都是一样的!可见,rand()生成的值并不随机。
标准库(stdlib)中随机数的一个可能的实现如下:
//代码示例 start
#define RAND_MAX 0x7fff
unsigned long int next = 1;
int rand(void)
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % RAND_MAX;
}
/*srand函数:为rand函数设置种子数*/
void srand(unsigned int seed)
{
next = seed;
}
//代码示例 end
由上可知,只要我们每次在程序运行开始时用srand设置好不同的nex值,那么程序每次运行都将得到不同是随机序列。那又如何给srand传入不同的数呢?随机数?好吧,这下变成鸡生蛋蛋生鸡的问题了。其实不用那么复杂。我们只需要把当前的时间作为srand的参数传入就好了。程序每次运行的时间点是肯定是不一样的。
要获取当前时间,可以使用time库中的time函数。示例如下:
//代码示例 start
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((int)time(0));
printf("%d %d\n", rand(), rand());
}
//代码示例 end
编译运行上述代码,就能让程序每次运行都得到不同的随机值了。
程序中time(0)函数返回值类型为time_t(time_t定义为长整型),time(0)返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。
int a = rand() % 100;
int b = rand() % 20 + 5;
执行上述代码后(当然前面应该调用srand函数),获取的整数a是[0, 100)区间的均匀随机整数;而获取的整数b,则是[5, 25)区间的均匀随机整数了。
//代码示例 start
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
float s;
srand((int)time(0));
s = rand() / RAND_MAX;
s = 3 + (5-3) * s;
printf("%f\n", s);
}
//代码示例 end
编译运行,好吧。为什么每次程序运行得到的结果都是3.0呢?程序逻辑没有问题的啊?!
在倒数第三行设置断点调试程序,我们会发现,在第一次完成对s的赋值之后,s的值为0.0。反复运行程序进行调试,s的值都是0.0。为什么s的值总是0.0呢?
原来,在C语言中,如果 / 操作符两边都是整数的话,那么运算后的结果也是一个整数,而且是向下取整的整数。即2 / 3得到0,3 / 2得到1。又由于rand()得到的值总是小于RAND_MAX,因此表达式 rand() / RAND_MAX也就只能得到整数0了,整数0在赋值给s时强制转换为浮点数0.0。
为了让 / 操作符进行浮点运算,我们可以将 / 操作符的操作数转化为浮点数。比如:(float)rand() / RAND_MAX;这样,就能得到我们想要的结果了。正确的例子如下:
//代码示例 start
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
float s;
srand((int)time(0));
s = (float)rand() / RAND_MAX;
s = 3 + (5-3) * s;
printf("%f\n", s);
}
//代码示例 end
C语言中随机数的生成的更多相关文章
- 【编程开发】C语言中随机数rand使用注意事项
[编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...
- C语言中随机数相关问题
用C语言产生随机数重要用到rand函数.srand函数.及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明. int rand(void);//生成一个随机数 voidsrand ...
- Python中随机数的生成
在Python中要实现随机数的生成,需要使用random模块中randint方法. 其具体实现方法如下: import random a = random.randint(1,20) #(1,20)为 ...
- C++中随机数的生成
1.随机数由生成器和分布器结合产生 生成器generator:能够产生离散的等可能分布数值 分布器distributions: 能够把generator产生的均匀分布值映射到其他常见分布,如均匀分布u ...
- C语言中生产随机数 rand()函数
参考资料:C语言中产生随机数 一:如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdl ...
- C语言中如何产生随机数
今天看到一段小程序 ,里面用到随机数.才发现在C语言中产生随机数不像matlab中那么简单. C中也有rand()函数,但是rand()函数产生的数不是真正意义上的随机数,是一个伪随机数,是根据一个数 ...
- js中Math.random()生成指定范围数值的随机数
http://www.111cn.net/wy/js-ajax/57062.htm Math.random() 这个方法相信大家都知道,是用来生成随机数的.不过一般的参考手册时却没有说明如何用这个方法 ...
- c语言中实现从0-1的随机数输出
原文:c语言中实现从0-1的随机数输出 今天晚上同学问了一个巨简单的问题,问我怎么用c语言输出0-1的随机数,可别说,一时之间还想不出来.在写的过程中发现,直接调用random函数还不能实现,用以下方 ...
- C语言中如何写一个简单可移植而又足够随机的随机数生成器
在C语言中标准库中的随机数产生函数的返回可能不是最优的,因为有些随机数生成器的低位并不随机,而另一些返回随机数的函数实现上又太复杂鸟.所以rand()%N并不是一个好方法,牛人给出的建议是使用: ra ...
随机推荐
- Flash cs6 帧上的菱形原来是关键帧
假如需要删除这个关键帧,选中它,然后右键,"清除关键帧",相应的类型即可. 因为之前学了一点点Flash,没见过帧上面这个菱形图标,才知道是关键帧.
- 通过Workbook类 生成Excel导出数据
需求: 实现错误信息生成Excel保存到本地让用户查看. 刚开始使用了微软自带的Microsoft.Office.Interop.Excel类库. Microsoft.Office.Interop.E ...
- SQL server 的约束条件【转】
SQLServer - 约束 一.约束的分类 在SQLServer中,有3种不同类型的约束. 1.实体约束 实体约束是关于行的,比如某一行出现的值就不允许出现在其他行,例如主键. 2.域约束 域约束是 ...
- Asp.net基础知识
1.[项目结构] 1.1文件后缀: .cs 源文件(程序代码) .csproj 项目文件(管理文件项) .sln 解决方案文件(管理项目) .config ...
- 关于懒加载(lazy loading)
懒加载---即为延迟加载,顾名思义在需要的时候才加载,这样做效率会比较低,但是占用内存低,iOS设备内存资源有限,如果程序启动使用一次性加载的方式可能会耗尽内存,这时可以使用懒加载,先判断是否有,没有 ...
- [leetcode] 401. Binary Watch
https://leetcode.com/contest/5/problems/binary-watch/ 这个题应该是这次最水的,这个题目就是二进制,然后是10位,最大1024,然后遍历,找二进制里 ...
- I/O继承关系图
InputStream/OutputStream继承关系图
- 九度OJ 1511 从尾到头打印链表
题目地址:http://ac.jobdu.com/problem.php?pid=1511 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测 ...
- CENTOS7 使用网络管理器配置静态IP地址
CENTOS7 的网络配置和CENTOS6有些不同. 如果你想要使用网络管理器来管理该接口,你可以使用nmtui(网络管理器文本用户界面),它提供了在终端环境中配置配置网络管理器的方式. 在使用nmt ...
- 使用XmlPullParser对xml进行读取
XML文件是一种标记性语言;在开发中经常在接口交互时被用作报文传输或者把自定义的类序列化为XML的形式存储到数据库.正因为XML文件这么常用,使用JAVA对XML文件进行读写操作是每一个开发人员必须掌 ...