做一个勇于分享的php园丁

PHP开发园地

PHP生成随机数详解

在PHP中,我们可以利用mt_rand()函数在给定的数字范围内生成一个随机数,例如下面的例子中,就利用PHP中的mt_rand()生成了一个大于等于$lower而小于等于$upper的随机数。

$random_number = mt_rand($lower, $upper);

当你想要在网页中随机显示一幅图像时,随机地设置游戏的开始位置时,从数据库中随机地选择一条记录时,或者生成一个随机的session标识符时,生成随机的数字都会非常有用。

要生成介于两个数之间的一个随机数,需要向mt_ rand()函数传递两个参数:

$random_number = mt_rand(1, 100);

如果在调用mt_rand()方法时不带任何参数,则会返回一个介0和最大的随机数之间的数,这个最大的随机数由mt_getrandmax()函数返回。

要生成真正的随机数,对于计算机而言并不是件容易的事。计算机擅长按照系统的指令运行,但却没有自发性。如果你想让计算机返回随机数,就需要给它设定一组可以重复执行的命令;事实上,就是让计算机不断地破坏可能出现的随机结果。

PHP中有两个不同的随机数生成程序,一个经典的函数叫rand(),而另一个更出色的函数是mt_rand()。 MT代表的是Mersenne Twister,源于法国的一位修道士兼数学家Marin Mersenne和他的素数类型。该算法就是基与这些素数。因为mt_ rand()更难以预测而且速度比rand()还要快,所以我更喜欢它而不是rand()。

如果你运行的是PHP 4.2之前的版本,那么在脚本中第一次使用mt_ rand()(或rand())函数之前,需要通过调用mt_ srand()(或srand())来产生“随机种子”。这个“随机种子”是随机函数用于生成返回的随机数的基础,也是对前面提到的重复性和随机性两难局面的一种解决方案。使用由microtime()—一个高精度的时间函数——返回的值,就可以得到一个变化迅速而且不可能重复的种子(即高品质的种子)。初始化这个种子后,就不用再对随机数生成器重复播种了。PHP 4.2及以后的版本会自动地生成“随机种子”,但是如果你在第一次调用mt_ rand()函数之前手动提供了一个种子,PHP不会用自己的新种子替换你的种子。

如果你想从数据库中随机地选择一条记录,一种简单的方式就是如下面例子中所示的那样,先找出数据表中所有记录的总数,并在该总数的范围内选择一个随机数,然后再从数据库中请求选中的随机数对应的那一行记录。如下PHP代码所示:

<?php
$sth = $dbh->query('SELECT COUNT(*) AS count FROM quotes');
if ($row = $sth->fetchRow()) {
$count = $row[0];
} else {
die ($row->getMessage());
}
$random = mt_rand(0, $count - 1);
$sth = $dbh->query("SELECT quote FROM quotes LIMIT $random,1");
while ($row = $sth->fetchRow()) {
print $row[0] . "\n";
}
?>
以上代码片断先找到数据表中记录的总数,并在该范围内计算出一个随机数,然后使用LIMIT $random 1来到数据表中从$random位置开始查询(SELECT)一行记录。

还有另一种可能的解决方案,如果你使用的是MySQL 3.23或以上的版本,可以这样来做:

$sth = $dbh->query('SELECT quote FROM quotes ORDER BY RAND() LIMIT 1');
while ($row = $sth->fetchRow()) {
print $row[0] . "\n";
}
这种情况下,MySQL会随机化记录行的排列顺序,然后返回第一行记录。

好了,PHP生成随机数的方法就介绍完了。

转载请注明:http://www.itivy.com/php/archive/2012/2/18/php-rand-mt-rand.html

标签: PHP, 随机数, rand(), mt_rand()

我也来参与讨论

你还可以输入600/600个字符 发表评论
称呼: (必填) 登录 | 开通博客
邮箱: (选填) 你的邮箱地址不会被公开
网站: (选填)
验证码: (必填)
看不清换一张 看不清楚换一张