使用PHP的范围[min-max]中的随机数


84

有没有一种方法可以根据最小值和最大值生成随机数?

例如,如果min为1且max为20,则应生成1到20之间的任何数字,包括1到20?


1
新的php版本具有加密安全的随机数生成器
萨尔瓦多·达利

1
对于PHP 7+使用random_int()random_bytes()openssl_random_pseudo_bytes() 。正如@Salvador Dali所说rand(),不会生成加密安全的结果。参见文档php.net/manual/en/function.rand.php
FrozenFire

Answers:


147
<?php
  $min=1;
  $max=20;
  echo rand($min,$max);
?>

我认为兰特的最小值和最大值是要使用的数字位数,而不是数字:) thnx
Val

相关:如果PHP_INT_MAX < ($max-$min),您需要按照此答案中所述将间隔加在一起。
主教

PHP7.1之前的rand()确实很糟糕。它使用LCG算法,结果可预测。它也很慢。由于PHP7.1 rand()被设置为mt_rand()的别名,因此不再是问题。PHP7还引入了加密安全的random_int(),但是除非有必要,否则应避免使用它,因为它比mt_rand()慢得多
xZero

34

在新的PHP7中,终于有了对加密安全的伪随机整数的支持。

int random_int ( int $min , int $max )

random_int —生成加密安全的伪随机整数

这基本上使以前的答案过时了。


2
那很棒!但是,直到Web主机更全面地支持PHP7为止,不幸的是,这对于构建可分发产品的任何人都没有用。因此,ALSO在PHP7上工作的先前答案仍然是最佳实践。
马特·克伦威尔

1
@MattCromwell。我不同意你的看法。直到托管服务支持PHP7我们应该使用填充工具random_intrandom_bytes功能- github.com/paragonie/random_compat
Vladimir Posvistelik '17年

我很好奇,是否有理由不使用random_int ?如果它提供“更好”的随机数,为什么出于非加密原因不使用它?
Brian Leishman

1
@BrianLeishman我宁愿将其用于所有内容。我唯一可以猜测的缺点是:它可能依赖于随机性的来源,如果您超出随机性,则可能会失败。它可能会更昂贵(需要检查),但我怀疑这一功能是否会产生重大变化
Salvador Dali

我确实知道它的速度较慢,但​​它微不足道,无法回退并将现有的random_ints更改为rands。另外,我的用例是一个重试算法,我绝对不希望多次失败的功能,因为可预测的随机整数的沉睡后结块
布赖恩·雷斯曼

19

一个更快的速度更快的版本将使用mt_rand:

$min=1;
$max=20;
echo mt_rand($min,$max);

资料来源:http : //www.php.net/manual/en/function.mt-rand.php

注意:您的服务器需要启用Math PHP模块才能正常工作。如果没有,请调试您的主机以启用它,或者您必须使用普通的(慢速的)rand()。


6
你的意思是更快吧?区别是(打字==快速vs更快==性能明智)
2014年



6

我将答案捆绑在这里,并使其独立于版本。

function generateRandom($min = 1, $max = 20) {
    if (function_exists('random_int')):
        return random_int($min, $max); // more secure
    elseif (function_exists('mt_rand')):
        return mt_rand($min, $max); // faster
    endif;
    return rand($min, $max); // old
}


0

试试这个。它将根据您的意愿生成ID。

function id()
{
 // add limit
$id_length = 20;

// add any character / digit
$alfa = "abcdefghijklmnopqrstuvwxyz1234567890";
$token = "";
for($i = 1; $i < $id_length; $i ++) {

  // generate randomly within given character/digits
  @$token .= $alfa[rand(1, strlen($alfa))];

}    
return $token;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.