首页 > 网站 > 建站经验 > 正文

PH_P的伪随机数与真随机数详解

2019-11-02 15:01:21
字体:
来源:转载
供稿:网友

   这篇文章主要介绍了PHP的伪随机数与真随机数详解,本文首先讲解了真随机数和伪随机数的相关概念,并给出了比用mt_rand()函数产生更好的伪随机数的一段例子代码,需要的朋友可以参考下

  首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。

  伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。

  首先来了解一下真随机数和伪随机数的概念。

  真随机数发生器:英文为:true random number generators ,简称为:TRNGs,是利用不可预知的物理方式来产生的随机数。

  伪随机数发生器:英文为:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的算法来产生的。

  对比一下两种办法产生的随机数的图片。

  Random.org(利用大气噪音来生成随机数,而大气噪音是空气中的雷暴所产生的 )生成的随机位图:

  Windows下PHP的rand()函数产生的随机图片:

  很显然,后者伪随机数发生器产生的图片有这明显的条纹。

  利用php的rand随机函数产生这张图片的代码为:

   代码如下:

  //需要开启gd库

  header("Content-type: image/png");

  $im = imagecreatetruecolor(512, 512)

  or die("Cannot Initialize new GD image stream");

  $white = imagecolorallocate($im, 255, 255, 255);

  for ($y=0; $y<512; $y++) {

  for ($x=0; $x<512; $x++) {

  if (rand(0,1) === 1) {

  imagesetpixel($im, $x, $y, $white);

  }

  }

  }

  imagepng($im);

  imagedestroy($im);

  实际上也并不是所有的伪随机数发生器(PRNGs)效果都这么差的,只是恰好在Windows下的PHP的rand(

中国历史[www.9-39.com/html/china/]
)函数是这样。如果是在Linux下 测试相同的代码的话,所产生的图片也看不出明显的条纹。在Windows下如果用mt_rand()函数替代rand()函数的话效果也会好很多。这是由 于mt_rand()用了Mersenne Twister(马其塞旋转)算法来产生随机数。PHP的文档还说:mt_rand() 可以产生随机数值的平均速度比 libc 提供的 rand() 快四倍。

  另外,Linux内核(1.3.30以上)包括了一个随机数发生器/dev/random ,对于很多安全目的是足够的。

  下面是关于Linux的随机数发生器的原理介绍 :

  Linux 操作系统提供本质上随机(或者至少具有强烈随机性的部件)的库数据。这些数据通常来自于设备驱动程序。例如,键盘驱动程序收集两个按键之间时间的信息,然后将这个环境噪声填入随机数发生器库。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表