php随机函数mt_rand()和rand()性能对比

例子 1. mt_rand() 范例

 代码如下 复制代码

<?php
echo mt_rand() . "n";
echo mt_rand() . "n";

echo mt_rand(5, 15);
?> 

上例的输出类似于:

1604716014
1478613278
6

 

注: 自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现已自动完成。

注: 在 3.0.7 之前的版本中,max 的含义是 range。要在这些版本中得到和上例相同 5 到 15 的随机数,简短的例子是 mt_rand (5, 11)。

参见 mt_srand(),mt_getrandmax() 和 rand()。

rand() 函数返回随机整数。

语法

rand(min,max)参数 描述
min,max 可选。规定随机数产生的范围。

说明

如果没有提供可选参数 min 和 max,rand() 返回 0 到 RAND_MAX 之间的伪随机整数。例如,想要 5 到 15(包括 5 和 15)之间的随机数,用 rand(5, 15)。
提示和注释
注释:在某些平台下(例如 Windows)RAND_MAX 只有 32768。如果需要的范围大于 32768,那么指定 min 和 max 参数就可以生成大于 RAND_MAX 的数了,或者考虑用 mt_rand() 来替代它。

注释:自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现在已自动完成。

注释:在 3.0.7 之前的版本中,max 的含义是 range 。要在这些版本中得到和上例相同 5 到 15 的随机数,简短的例子是 rand (5, 11)。

mt_rand()真的会比rand()快4倍吗?

带着这个疑问,一边自己测试一边看网上的介绍,测试如下。

mt_rand()和rand()对比测试一

测试代码:

 代码如下 复制代码

<?php
$max = 100000;
$timeparts = explode(' ',microtime());
$stime = $timeparts[1].substr($timeparts[0],1);
$i = 0;
while($i < $max) {
rand();
$i++;
}
$timeparts = explode(' ',microtime());
$etime = $timeparts[1].substr($timeparts[0],1);
$time = $etime-$stime;
echo "{$max} random numbers generated in {$time} seconds using rand();
";

$timeparts = explode(' ',microtime());
$stime = $timeparts[1].substr($timeparts[0],1);
$i = 0;
while($i < $max) {
mt_rand();
$i++;
}
$timeparts = explode(' ',microtime());
$etime = $timeparts[1].substr($timeparts[0],1);
$time = $etime-$stime;
echo "{$max} random numbers generated in {$time} seconds using mt_rand();
";
?>

结果:

第一次测试
100000 random numbers generated in 0.024894952774048 seconds using rand();
100000 random numbers generated in 0.028925895690918 seconds using mt_rand();
第二次测试
100000 random numbers generated in 0.03147292137146 seconds using rand();
100000 random numbers generated in 0.02997088432312 seconds using mt_rand();
第三次测试
100000 random numbers generated in 0.028102874755859 seconds using rand();
100000 random numbers generated in 0.02803111076355 seconds using mt_rand();
第四次测试
100000 random numbers generated in 0.025573015213013 seconds using rand();
100000 random numbers generated in 0.028030157089233 seconds using mt_rand();

这个结果只是几次的显示结果,多测试几次你会发觉,两者是交替变化的,其实两者没有太大的差异。

mt_rand()和rand()对比测试二

本人测试环境
操作系统:windows xp
apache 2.0
php 5.2.12
内存 2G

 代码如下 复制代码

<?php
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
for($i=0; $i<1000000; ++$i)
{
    rand();
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "rand() cost $time secondsn";

$time_start = microtime_float();
for($i=0; $i<1000000; ++$i)
{
    mt_rand();
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "mt_rand() cost $time secondsn";
?>

结果:
第一次
rand() cost 0.25919604301453 seconds
mt_rand() cost 0.28554391860962 seconds
第二次
rand() cost 0.31136202812195 seconds
mt_rand() cost 0.28973197937012 seconds
第三次
rand() cost 0.27545690536499 seconds
mt_rand() cost 0.27108001708984 seconds
第四次
rand() cost 0.26263308525085 seconds
mt_rand() cost 0.27727103233337 seconds

结果还是一样:两者用的时间是交替变化,其实两者没有太大的差异
php的mt_rand()与rand()对比结论

在网上看了很多别人的测试,有linux的还有windows环境的,大多数人得出的结果和我的一样:两者相差无几,不过也有人测出mt_rand()比rand()快4倍,但是由于他们没给出具体的测试环境,所以无法判断真假。我还是比较相信我的结论,因为我看到有人这样介绍mt_rand()与rand():

那为什么php手册上说mt_rand()比rand()快4倍呢?

这是因为mt_rand()使用的Mersenne Twister algorythm是1997的事,所以在10年前,和rand()在速度上的差异是(4倍)。
自2004年,rand()已经开始使用algorythm,所以现在它们速度上没有太大的区别

从上面的各种测试来看它们之间并没有区别,只是在不同系统中可能数值会有变化了。

时间: 2024-08-19 22:25:05

php随机函数mt_rand()和rand()性能对比的相关文章

php中随机函数mt_rand()与rand()性能对比分析_php技巧

本文实例对比分析了php中随机函数mt_rand()与rand()性能问题.分享给大家供大家参考.具体分析如下: 在php中mt_rand()和rand()函数都是可以随机生成一个纯数字的,他们都是需要我们设置好种子数据然后生成,那么mt_rand()和rand()那个性能会好一些呢,下面我们带着疑问来测试一下. 例子1. mt_rand() 范例,代码如下: 复制代码 代码如下: <?php echo mt_rand() . "n"; echo mt_rand() . &quo

四种整数数据类型的性能对比

数据|数据类型|性能 在我们写VBA程序的时候,我们经常要面对数据类型定义的选择,有的情况下,业务本身对于数据类型有要求和限制,那么我们并不难以选择,有些时候却没有限制,我们可以任意选用四种整数类型(Byte,Integer,Long,Currency)中的一种,例如: For i=1 to 100 在这行代码中,我们该把变量i定义为什么类型的变量呢?显然四种整数类型都可以正常运行,但是他们的效率是否相同呢?我们到底该如何选择?有的人说,当时是选最小的数据类型Byte,有的人说在32位系统上,3

HBase在单Column和多Column情况下批量Put的性能对比分析

针对HBase在单column family单column qualifier和单column family多column qualifier两种场景下,分别批量Put写入时的性能对比情况,下面是结合HBase的源码来简单分析解释这一现象. 1. 测试结果 在客户端批量写入时,单列族单列模式和单列族多列模式的TPS和RPC次数相差很大,以客户端10个线程,开启WAL的两种模式下的测试数据为例, 单列族单列模式下TPS能够达到12403.87,实际RPC次数为53次: 单列族多列模式下,TPS只有

Hadoop虚拟化的性能对比和调优经验

虚拟化为Hadoop注入了前所未有的活力,从IT生产管理的角度,表现为以下几点: ·Hadoop和其他消耗不同类型资源的应用一起部署共享数据中心可以提高总体资源利用率: ·灵活的虚拟机操作使得用户可以动态的根据数据中心资源创建.扩展自己的Hadoop集群,也可以缩小当前集群.释放资源支持其他应用如果需要: ·通过与虚拟化架构提供的HA.FT集成,避免了传统Hadoop集群中的单点失败,再加之Hadoop本身的数据可靠性,为企业大数据应用提供了可靠保证. 基于这些原因,vSphere Big Da

Windows 7和Windows Vista处理器、内存性能对比

Windows 7和Windows Vista的性能对比评测很多,但大多都是关于3D游戏的,不过玩游戏毕竟不是长久之计,所以今天我们再看看另外两个更基本的方面:处理器和内存性能. 测试平台配置: 处理器:Core i7-920 OC 4GHz (200MHz×20) 散热器:Noctua NH-U12P 主板:技嘉GA-EX58-UD5 显卡:技嘉GeForce GTX 285 内存:OCZ Blade PC-16000 DDR3 2GB×3 (7-8-7-20) 硬盘:西部数据VelicoRa

oracle 10g数据泵和导入导出性能对比(五)影响数据泵导入性能的最大因素

前一段时间在一次迁移中同时用到了数据泵和EXP,发现二者效率的差别还是相当大的.这里通过一个例子简单比较一下. 这篇文章讨论影响数据泵导入性能的最大因素. 前面写了几篇文章,分别介绍EXP/IMP与EXPDP/IMPDP的性能对比,根据前面几篇文章的描述,如果不使用并行,似乎IMPDP的效率要比IMP没有一个数量级的提示.对于当前的环境而言,事实确实如此.不过前面一直没有描述一个重要的因素,当然的数据库环境由于配置了STANDBY数据库,因此不但处于归档模式,还设置了FORCE LOGGING:

手机/笔记本/台式机CPU性能对比评测

  近日国外著名的PRIMATE LABS发布了全新的Geekbench 4测试工具,除了一如既往的支持跨平台对比,加入了更多的量纲指标来评估CPU和GPU的效能,比如调整了整数.浮点数.内存的各自所占比例,同时加入了GPU测试(Compute),多平台对比更加平衡. Geekbench 4是以Intel Core i7-6600U性能作为基准分数--4000分,自然高于4000分有更好的性能,而低于4000分则体验就逐渐降低.而上一代Geekbench 3则是基于Intel Core i5-2

最新显卡性能对比图

  电脑的性能主要由CPU.内存.硬盘和显卡来决定,内存和硬盘选择余地不宽,而独立显卡的型号太多了,怎么才能选择一款高性价比显卡呢?我们先一起看看下面这幅图,从图中可以轻松看出当前主流N卡和A卡的性能对比.(此文更新时间:2016年6月21日) 建议:显卡选择分为四个档次 入门首选: GT730K 1GD5(注:2GD5版本性价比不高,这个级别建议1GD5版本) 中级首选: GTX750Ti 中高首选: GTX950. GTX960 高端首选: GTX970.GTX1070.GTX1080 喜欢

远程桌面连接的多媒体重定向功能介绍及性能对比

  故障现象: 远程桌面连接的多媒体重定向功能介绍及性能对比. 解决方案: 远程桌面连接的多媒体重定向功能在客户端和主机端都支持时启用,其主要作用为在主机端播放的文件在客户端进行解码播放,而不是直接传送bitmap.其主要优势在于: 1. 节约带宽资源. 2. 节约主机的CPU资源. 具体效果对比,参照下图: