刚好在找这方面的资料,看到了一片不错的,就全文转过来了,省的我以后再找找不到。

在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日零时零分零秒到目前为止所经过的时间,单位为秒。

好了,到目前为止,我们已经解决了如何在区间[0, RAND_MAX]内等概率随机获得一个整数的问题。那么又应该如何等概率的随机获取任意范围内的整数呢?其实只需要对rand()函数生成的随机数进行取模运算就可以了。参考下述代码:
    int a = rand() % 100;
    int b = rand() % 20 + 5;
执行上述代码后(当然前面应该调用srand函数),获取的整数a是[0, 100)区间的均匀随机整数;而获取的整数b,则是[5, 25)区间的均匀随机整数了。

但紧接着我们不禁要问了:随机浮点数又该怎么生成呢?其实很简单,用rand()生成的数除以RAND_MAX,不就能得到0~1之间的浮点数了么?而要得到区间[a, b]的浮点数,用这个值扩展一下不就好了?比如 s= rand() / RAND_MAX; s = a + (b-a)* s;这样就能得到我们想要的随机数s了。好的,假如我们要得到区间[3, 5]之间的一个随机浮点数,那么很简单,代码如下: 
//代码示例 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语言中随机数的生成的更多相关文章

  1. 【编程开发】C语言中随机数rand使用注意事项

    [编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...

  2. C语言中随机数相关问题

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

  3. Python中随机数的生成

    在Python中要实现随机数的生成,需要使用random模块中randint方法. 其具体实现方法如下: import random a = random.randint(1,20) #(1,20)为 ...

  4. C++中随机数的生成

    1.随机数由生成器和分布器结合产生 生成器generator:能够产生离散的等可能分布数值 分布器distributions: 能够把generator产生的均匀分布值映射到其他常见分布,如均匀分布u ...

  5. C语言中生产随机数 rand()函数

    参考资料:C语言中产生随机数 一:如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdl ...

  6. C语言中如何产生随机数

    今天看到一段小程序 ,里面用到随机数.才发现在C语言中产生随机数不像matlab中那么简单. C中也有rand()函数,但是rand()函数产生的数不是真正意义上的随机数,是一个伪随机数,是根据一个数 ...

  7. js中Math.random()生成指定范围数值的随机数

    http://www.111cn.net/wy/js-ajax/57062.htm Math.random() 这个方法相信大家都知道,是用来生成随机数的.不过一般的参考手册时却没有说明如何用这个方法 ...

  8. c语言中实现从0-1的随机数输出

    原文:c语言中实现从0-1的随机数输出 今天晚上同学问了一个巨简单的问题,问我怎么用c语言输出0-1的随机数,可别说,一时之间还想不出来.在写的过程中发现,直接调用random函数还不能实现,用以下方 ...

  9. C语言中如何写一个简单可移植而又足够随机的随机数生成器

    在C语言中标准库中的随机数产生函数的返回可能不是最优的,因为有些随机数生成器的低位并不随机,而另一些返回随机数的函数实现上又太复杂鸟.所以rand()%N并不是一个好方法,牛人给出的建议是使用: ra ...

随机推荐

  1. 【转】The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?...

    [转]The content of element type "configuration" must match "(properties?,settings?,typ ...

  2. 20160526-20160531mybatis入门进阶

    mybatis第二天  高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一人持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...

  3. 树莓派配置AP模式

    所需硬件:树莓派.无线网卡 1.查看无线网卡是否被识别 pi@raspberrypi ~ $ sudo lsusb Bus Device : ID : Standard Microsystems Co ...

  4. ###《Effective STL》--Chapter2

    点击查看Evernote原文. #@author: gr #@date: 2014-09-15 #@email: forgerui@gmail.com Chapter2 vector和string T ...

  5. iOS-深复制(mutableCopy)与浅复制(copy)

    浅复制:只复制指向对象的指针,而不复制引用对象本身.对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只是一个指针,对象本身资源还是只有一份(对象引用计数+1),那如果我们对A_copy执 ...

  6. OC中 block 的用法

    block 常用于反向传值 声明 返回值类型 (^block)(参数列表) 调用 闭包的名字=^(参数列表){}: 闭包的名字(): 如: void(^aaaaa)(int num,NSString ...

  7. Java实战之04JavaWeb-01Servlet

    一.Http协议 1.什么是http协议? http协议就是描述客户端与服务器端交互过程的 2.http的请求 3.http的响应 二.Servlet的简介 1.Servlet的概述 Servlet: ...

  8. java中instanceof和getClass()的作用

    初学者难免有点混淆java中instanceof和getClass()的作用,  下面就来一一讲解. 父类A: class A { } 子类B: class B extends A { }  构造对象 ...

  9. PHP连接sqlserver的两种方法,向sqlserver2000中写入数据,中文乱码

    项目环境是php5.3.28 项目用的ThinkPHP3.2.3  已经mysql5.5数据库,要和另一个项目对接,需要连接sqlsever2000数据库进行一些操作. 第一种用php自带扩展连接数据 ...

  10. mysql---union和左连接的两倒面试题

    第一道: 思路:无非是将hid与gid与t表中的tname关联起来.实质上是三表关联(m,t,t) 先将hid与tname关联起来,运用左连接 再将结果集与t表中的tname关联起来,使得gid与tn ...