这篇文章主要介绍了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()函数是这样。如果是在Linux下 测试相同的代码的话,所产生的图片也看不出明显的条纹。在Windows下如果用mt_rand()函数替代rand()函数的话效果也会好很多。这是由 于mt_rand()用了Mersenne Twister(马其塞旋转)算法来产生随机数。PHP的文档还说:mt_rand() 可以产生随机数值的平均速度比 libc 提供的 rand() 快四倍。

以下是使用PHP时比用mt_rand()函数产生更好的伪随机数的一段例子代码:

代码如下:<?php

// get 128 pseudorandom bits in a string of 16 bytes

$pr_bits = '';

// Unix/Linux platform?

$fp = @fopen('/dev/urandom','rb');

if ($fp !== FALSE) {

$pr_bits .= @fread($fp,16);

@fclose($fp);

}

// MS-Windows platform?

if (@class_exists('COM')) {

try {

$CAPI_Util = new COM('CAPICOM.Utilities.1');

$pr_bits .= $CAPI_Util->GetRandom(16,0);

// if we ask for binary data PHP munges it, so we

// request base64 return value. We squeeze out the

// redundancy and useless ==CRLF by hashing...

if ($pr_bits) { $pr_bits = md5($pr_bits,TRUE); }

} catch (Exception $ex) {

// echo 'Exception: ' . $ex->getMessage();

}

}

if (strlen($pr_bits) < 16) {

// do something to warn system owner that

// pseudorandom generator is missing

}

?>

所以PHP要产生真随机数 还是要调用外部元素来支持的!

php真随机数,php 的伪随机数与真随机数实例详解相关推荐

  1. C\C++真桌面贪吃蛇,桌面操控,有音乐音效“详解”

    C\C++真桌面贪吃蛇,桌面操控,有音乐音效"详解" 1. 桌面图标贪吃蛇!采用HOOK技术HOOK桌面,可以以桌面为焦点运行贪吃蛇.有背景音乐和音效,采用管道技术,实现音乐音效混 ...

  2. 网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]AC/AP/EG部分答案详解

    网络技能大赛-2019年国赛真题[2019年全国职业技能大赛高职组计算机网络应用赛项真题-H卷]AC/AP/EG部分答案详解 2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Li ...

  3. 北航数据结构与c语言2017答案,2022年北京航空航天大学991数据结构与C语言程序设计考研资料汇总:参考书目-历年考研真题-模拟题库-笔记和课后习题详解...

    北京航空航天大学软件学院官网网址: 991数据结构与C语言程序设计考研参考书目: 谭浩强<C程序设计>(第4版)笔记和课后习题详解 谭浩强<C程序设计>(第4版)精讲班[教材精 ...

  4. 网络技能大赛-2018年国赛真题[2018年全国职业技能大赛高职组计算机网络应用赛项真题-I卷]AC/AP/EG部分答案详解

    网络技能大赛-2018年国赛AC/AP/EG部分答案详解 2022年全国职业技能大赛网络系统管理赛项相较2021年再次做出改动,Linux部分从之前的Debian又换回了CentOS,不过相应增加了U ...

  5. 用于生成随机数的python标准库模块是_详解Python基础random模块随机数的生成

    详解Python基础random模块随机数的生成 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  详解Python基础random模块随机数的生成.txt ] ( ...

  6. c语言随机变量seed,如何产生随机数?C语言rand()和srand()用法详解

    在实际编程中,我们经常需要生成随机数.因此rand()与srand()出现了,本文详解随机数相关内容 一.rand()函数相关 函数头文件:stdlib.h 函数定义:int rand(void) 函 ...

  7. kotlin发音!这份字节跳动历年校招Android面试真题解析,附架构师必备技术详解

    前言 从2010年开始Android市场开始需要大量的Android开发人员,招聘市场上也开始大量招Android开发人员,大量java开发者开始学习Android开发,招聘市场面试要求上只要有一定j ...

  8. C++随机数(rand和srand)函数用法详解

    C++ 提供了一组函数以生成和使用随机数字.随机数字就是从一组可能的值中进行随机选择而获得的一个值.该组中的值都有相同的被选中的几率. 随机数字常用于许多不同类型的程序中,以下是一些示例: 计算机游戏 ...

  9. python random库生成伯努利随机数的方法_Python使用random模块生成随机数操作实例详解...

    本文实例讲述了Python使用random模块生成随机数操作.分享给大家供大家参考,具体如下: 今天在用Python编写一个小程序时,要用到随机数,于是就在网上查了一下关于Python生成各种随机数的 ...

最新文章

  1. 弹性计算双周刊 第 9 期
  2. 艾伟:ASP.NET MVC,深入浅出IModelBinder,在Post方式下慎用HtmlHelper
  3. java 中 Object XML 互转,最终选择Xstream
  4. Objective-C之MRC、ARC模式下,属性修饰关键字strong、retain、assign、weak的区别和联系...
  5. selenium 简介 及浏览器配置
  6. 关于get和post的区别
  7. ppt取色html,ppt如何使用取色器? ppt取色器的使用方法
  8. 【倒计时】用JS写出京东倒计时效果
  9. STM32——电容触摸按键实验
  10. openwrt MT7620A编译dropbear
  11. Kaggle无法出现人机验证的解决办法
  12. 在Android平台上搭建Qualcomm的FastCv
  13. 基于Cortex-A7架构的嵌入式linux ARM裸机开发<2>——LED灯闪烁(C版本)
  14. ArcGIS中利用DEM数据生成地形图既视感的等高线;利用掩膜进行等高线注记;DEM的可视化表达总结
  15. 微信小程序开发者工具-使用技巧(更新中~)
  16. linux 删除文件夹admin 报错 Linux cannot remove is a directory
  17. CAD外部参照文件的分解
  18. jdk1.6 jdk1.7 jdk1.8解压版及安装版统一下载地址
  19. seo标题关键词设置(seo标题关键词怎么写)
  20. 【Java游戏开发项目-01贪吃蛇】强烈推荐Java小白练手!!!

热门文章

  1. 怎么将SVG转成PNG(.NET工具包编写)
  2. C#实现乞丐版IOC容器
  3. 进击吧! Blazor !第四期 组件开发
  4. 深入async/await知多少
  5. ASP.NET Core技术研究-全面认识Web服务器Kestrel
  6. 5分钟看懂微服务架构下的Consul 特性及搭建
  7. 集成平台集群任务动态分派
  8. Kubernetes,多云和低代码数据科学:2020年最热门的数据管理趋势
  9. 被忽略的TraceId,可以用起来了
  10. linux 安装 powershell