头文件:#include

函数原型:long int random(void);

void srandom(unsigned int seed);

char*

initstate(unsigned int seed,char* state,size_t n);

char* setstate(char* state);

int rand(void);

int

rand_r(unsigned int* seedp);

void

srand(unsigned int seed);

注意一下几点:

1、random和rand的区别

很多编译器的rand(GCC除外)rand函数采用的是乘同余算法,这种算法比较简单,产生的随机数的不重复周期较短(一般小于2**sizeof(int))。而random函数采用的是“非线性增长-反馈”算法,此算法产生的随机数的不重复周期较长(一般为16*(2**sizeof(int)-1))。 乘同余算法之所以产生的随机数不重复周期短是因为它每步循环后都只有一个变常量next被传递到下一循环,即使next是unsigned

int类型,也只有64位,而“非线性增长—反馈”算法是一组变常量在循环之间传递,可以高达2048位(最低64位,与线性算法相同),使得有限状态自动机的状态数目大大增多,从而增加了不重复周期长度。

random函数实现比较复杂,所以速度比rand函数慢一点,但因为其不重复周期长,所以不用频繁初始化。

random的返回值是long int型,而rand函数的返回值是int型。

乘同余的rand函数和srand函数的实现举例:

static unsigned long int next;//next的定义

int

myrand()//rand函数的实现版本

{

next = next * 1103515245 + 12345;

return((unsigned)(next/65536) % 32768);

}

void mysrand(unsigned seed) //srand函数的实现版本

{

next = seed;

}

GCC的rand函数采用“非线性增长-反馈”的算法(高位随机率和低位随机率相同),但更早的版本或不同的系统上可能采用的乘同余算法(高位的随机率比低位的随机率高),所以为了兼容,取某个范围内的随机数时,应该取高位。

If you want to generate a random integer between 1 and 10, you

should always do it by using high-order bits, as

in

j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

and never by anything resembling

j = 1 + (rand() % 10);

(which uses lower-order bits).

2、rand和rand_r的区别

rand函数是非线程安全的,因为没调用一次rand函数,都要改变其状态值(如next值),由于同一进程的不同线程之间共享这些状态,所以每个线程对rand函数的调用,会影响到其他线程对rand的使用,所以在多线程环境中应该使用明确指定seed值的rand_r函数。

3、srand(srandom同)

srand函数为rand函数指定种子,在调用rand函数之前假如没有调用srand函数,则默认rand函数的种子为1。假如srand指定的种子没有变化,则每次执行所产生的随机数序列是相同的。若srand每次指定的seed是不同的,则每次执行所产生的随机数序列是不同的。相当于每一个种子对应一串伪随机数序列,不同的种子对应不同的伪随机数序列。若要想每次执行执行产生的随机数序列不同,可以向srand函数传递可变化的参数,例如

srand((unsigned)time(0));。注意,使用time函数应引入头文件#include。

4、RAND_MAX的值一般为2**(sizeof(int)-1);

5、rand_r函数的调用对rand函数没有影响。即若调用了rand_r函数,然后再调用rand函数(之前没有调用srand函数),则rand函数仍会产生默认种子值1的伪随机数序列。

c语言随机数表,C语言随机数相关推荐

  1. c语言用随机数定义数组中,C语言 将发生的随机数存入数组,数据不能相同

    C语言 将产生的随机数存入数组,数据不能相同 1.定义一个一维数,数组大小为24. 2.产生0~23的随机数. 3.将产生的随机数存入i数组,要求数组中的每个数据不能相同. 4.补充说明,这个子程序要 ...

  2. c语言学习进阶-C语言程序产生正态分布随机数

    C语言程序产生正态分布随机数 目录 C语言程序产生正态分布随机数 **中心极限定理(大数定理)** **Hasiting有理逼近法:** **反函数产生给定分布的随机数法:** **Box-Mulle ...

  3. C语言如何产生一个随机数,rand函数的使用

    C语言中用于产生随机数的函数是rand(), 下面我用程序详细说明一下如何在C语言下产生随机数. 示例代码如下: #include <stdio.h> #include <strin ...

  4. C语言怎么打出泊松分布随机数,泊松分布随机数

    一.功能 产生泊松分布的随机数. 二.方法简介 泊松分布的概率密度函数为 \[ f(x)=\frac{\lambda ^{x}e^{-\lambda }}{x!} \qquad x\in \left ...

  5. c语言中什么情况下会出现随机数,C语言中如何产生随机数

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

  6. C语言rand()函数产生随机数详解

    C语言rand函数产生随机数详解 1.rand函数的原型,功能和界限 2.用rand函数获取随机数 3.随机数生成原理 1.rand函数的原型,功能和界限 rand函数的原型: #include &l ...

  7. c语言产生32位随机数,C语言,如何产生随机数

    1. 基本函数 在C语言中取随机数所需要的函数是: int rand(void); void srand (unsigned int n); rand()函数和srand()函数被声明在头文件stdl ...

  8. go语言学习:语言简介

    一.Go语言简介 Go语言(或 Golang) 起源于 2007 年,并在 2009 年正式对外发布.Go 是非常年轻的一门语言,它的主要目标是"兼具 Python 等动态语言的开发速度和 ...

  9. 2,Java语言基础-Java语言基本程序设计知识

    Java语言基础 Java语言基本程序设计知识 1,JavaAPI概述 1.1,什么是API API是指应用程序接口( Application Program Interface, API),故名思意 ...

最新文章

  1. 常考数据结构与算法:单链表的排序
  2. 通信原理随机信号分析
  3. 关于 pip install mysqlclent安装失败 ERROR: No matching distribution found for mysqlclient 的解决方案
  4. python界面开发工具免费_Python程序员必备的四款开发工具
  5. java 泛型--桥方法
  6. Oracle WorkFlow(工作流)(一)
  7. 不要62(HDU-2089)
  8. visionpro定位不跟随图像_医海探弋,TMS定位技术的发展分析
  9. Excel导出改造_只填写字典类型_就可以自动对应导出_字典类添加获取字典值方法---SpringCloud Alibaba_若依微服务框架改造---工作笔记013
  10. JS----正则表达式
  11. python跟java 效率_Python注重可读性和效率:与Java、PHP以及 C++语言对比谁受欢迎?...
  12. React学习笔记六 React拓展 - SetState
  13. [转]vs2003,安装程序检测到另一个程序要求计算机重新启动
  14. 给年轻人几点买房建议
  15. nodejs+vue++Elementui漫画赏析网站系统源码
  16. 5G无线技术基础自学系列 | 5G组网方式
  17. react项目中使用消息订阅(subscribe)-发布(publish)机制
  18. 支付宝存漏洞?这10招保护个人信息赶紧保存起来!
  19. html怎么随机设置颜色,设置随机颜色值
  20. 了解和深入行业/APP分类

热门文章

  1. (一)JAVA 点滴积累之JAVA开发环境安装
  2. jmap与jstat工具实战分析
  3. MySQL数据类型及sql模型及服务器变量
  4. android-studio于java相关
  5. 数据库提示日志文件不可用
  6. 使用checked关键字处理“溢出”错误
  7. 清除SQL被注入script恶意病毒代码的语句
  8. SQL2008安装出现问题invoke---beginInvoke
  9. Netty工作笔记0025---SocketChannel API
  10. memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作