转载自:http://www.cnblogs.com/xkfz007/archive/2012/03/27/2420154.html

关于“随机数”产生有许多算法,但无论如何,都不可能产生真正随机数,因为电脑程序是个确定状态转换机,一种输入必定产生一种确定输出。   
但要实现“不可预知”还是可以做到的,只需有“不可预知”的输入或者初始化就可以了,像系统时间,网络实时带宽,Cpu使用率等等都可以作为“不可预知”的量来初始化随机函数。

产生整数rand的原理是:   
      y=(ax+b)(mod  n)。其中n一般是一个很大的素数(几万)。a也是大素数,而且a,b,n都是常数。所以rand的产生决定于x,他被称seed。每一个seed都是上一次产生的y的函数。这样,如果直接取seed=y的话,虽然产生的rand之间相关性甚小,但只要知道某个y,就能推知以后的rand。   为避免这种情况,一般取seed为y和当时计算机的时间的函数,如seed=y+t系统里的随机数是利用初等数论中的同余定理来实现的.  比如C中对于rand()函数是如下实现的.

1
2
3
4
5
6
7
8
9
10
11
12
unsigned long int next = 1;
/* rand:  return pseudo-random integer on 0..32767 */
int rand(void)
{
    next = next * 1103515245 + 12345;
    return (unsigned int)(next / 65536) % 32768;
}
/* srand:  set seed for rand() */
void srand(unsigned int seed)
{
    next = seed;
}

另外一个高级一点的随机数生成为:

下面是源代码:

unsigned int x = 123456789,y = 362436000,z = 521288629,c = 7654321; /* Seed variables */ unsigned int KISS()
{  unsigned long long t, A = 698769069ULL;  x = 69069*x+12345;  y ^= (y<<13); y ^= (y>>17); y ^= (y<<5);  t = (A*z + c);c = (t >> 32);z = t;return x+y+z;
}

居然就只是把“线性同余”,“移位轮转”和“带记忆乘法”这3种基本的随机数发生法一起用,便获得很好的效果。的确够巧的,从这一点上说,比Mersenne Twister要有趣多了。而且通过它,我们一次就学会3种随机数发生法。抽出其中任何1种,都可以单独使用,仿佛一把瑞士军刀。

线性同余法生成的是伪随机数,粗略符合均匀分布。根据中心极限定理,任何分布的噪声,通过反复相加,就可以成为高斯噪声。

rand()函数实现原理:线性同余法相关推荐

  1. C++:rand()函数和srand()函数解读

    (1)srand(unsigned int t)这个是设定种子. 因为电脑取随机数是伪随机,只要种子一样,则取出来的数一定一样. 这里用time(0)这个内函数,copy则是返回了当前的时间值. 这个 ...

  2. C语言(rand函数)

    C语言(rand函数) (2006-09-24 20:41:59) 转载     srand()就是给rand()提供种子seed 1,先看一个例子 #include <iostream> ...

  3. Rand函数使用和对补码的理解

    下面是在牛客网看到的一道题; //假设这n个数的序号依次为0,1,2,...,n-1,数组名为num void knuth1(int* pNum, int m, int n){srand((unsig ...

  4. C++ rand()函数和srand()函数

    随机数和伪随机的区别 : #include<iostream> using namespace std; #include<string>#include<string& ...

  5. 【随机数生成算法系列】线性同余法和梅森旋转法

    一般我们用到的随机算法都是伪随机算法,什么叫伪随机算法呢?伪随机算法意思是假如知道第一个随机种子和随机算法的话就可以推算出下一个随机数.通常我们程序里都是通过当前时间作为随机函数的第一个随机种子,然后 ...

  6. srand()和rand()函数详解

    头文件 C语言:<stdlib.h> C++ :<stdlib.h> 或<cstdlib> 函数原型 int rand(void): void srand(unsi ...

  7. C++中rand()函数的用法

    C++中rand() 函数的用法 1.rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数. 2.如果你要产生0~99这100个整数中的一个随机整数, ...

  8. C语言中 srand()函数和rand()函数

    一.rand() rand()函数需要的头文件是:<stdlib.h> rand()函数原型:int rand(void); rand()函数用来产生随机数,但是,rand()的内部实现是 ...

  9. C语言:srand函数与rand函数的使用(纯干货)【易懂】

    C语言:srand函数与rand函数的使用(纯干货)[易懂] 文章目录 C语言:srand函数与rand函数的使用(纯干货)[易懂] 一.rand() 二.srand() 三.time() 四.运用: ...

  10. rand()函数产生随机数

    转载link #include <stdio.h> #include <stdlib.h> #include <time.h> /* rand() 函数是一种不需要 ...

最新文章

  1. linux下必看的60个命令
  2. Windows8 下安装 Materials Studio 6.0 全过程
  3. Hibernate Tools for Eclipse的使用
  4. 手写简版spring --4--注入属性和依赖对象
  5. PYPL 7月榜单公布:Java份额出现下降趋势
  6. ValueError: check_hostname requires server_hostnamejie解决方案
  7. hdu1962Corporative Network带权回路
  8. mysql创建数据库与表_PHP MySQL 创建数据库和表 之 Create
  9. double四舍五入
  10. SQL SERVER数据库开发之触发器的应用
  11. mysql升级到5.7版本后,运行程序报错this is incompatible with sql_mode=only_full_group_by
  12. Linux 命令(30)—— scp 命令
  13. centOs7 虚拟机设置文件共享
  14. Heavyocity PUNISH Lite for Mac - 虚拟自动音频增强效果器
  15. 购物搜索引擎架构的变与不变
  16. rstudio导入txt文件_r语言怎么读取txt文件
  17. 关于如何将SQL2008 R2数据库迁移到SQL2008
  18. 云锁卸载 linux,ubuntu下云锁卸载出错后无法重新安装的解决办法checking installation environment:...
  19. VMware安装Linux详细教程
  20. transformation-matrix

热门文章

  1. Hadoop环境搭建
  2. Manjaro下安装和美化i3wm,以及相关软件配置
  3. 孪生网络图像相似度_孪生网络(Siamese Network)
  4. html三级下拉栏插件,纯js超酷下拉框插件tastySelect
  5. Python错误和异常
  6. Labview程序优化
  7. 《人工智能:一种现代的方法》总结 第二章
  8. Scala下载,安装及配置
  9. 发现一个很好用的 SVG 在线编辑器-Method Draw
  10. DEM高程数据的获取和应用(全国DEM数据可直接下载)