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

使用PHP在[min-max]范围内的随机数,php,security,random,Php,Security,Random,有没有办法根据最小值和最大值生成一个随机数 例如,如果最小值为1,最大值为20,则应生成1到20之间的任何数字,包括1到20? <?php $min=1; $max=20; echo rand($min,$max); ?> 或 PHP的rand函数的文档如下: 使用srand()函数设置随机数生成器的种子值。更快的版本将使用mt\u rand: $min=1; $max=20; echo mt_rand($min,$max); 来源: 注意:您的服务器需要启用M

有没有办法根据最小值和最大值生成一个随机数

例如,如果最小值为1,最大值为20,则应生成1到20之间的任何数字,包括1到20?


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

PHP的rand函数的文档如下:

使用
srand()
函数设置随机数生成器的种子值。

更快的版本将使用mt\u rand:

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


注意:您的服务器需要启用Math PHP模块才能工作。如果没有,请对主机设置bug以启用它,或者您必须使用正常(和较慢)的rand()。

试试这个。它将根据您的意愿生成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;
}
函数id()
{
//加限额
$id_长度=20;
//添加任何字符/数字
$alfa=“abcdefghijklmnopqrstuvxyz1234567890”;
$token=“”;
对于($i=1;$i<$id\u长度;$i++){
//在给定字符/数字内随机生成
@$token.=$alfa[兰特(1,斯特伦($alfa))];
}    
返回$token;
}
在一个新版本中,终于有了对

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


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

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

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
}

我认为rand的min和max是要使用的位数,而不是数字:)thnxRelated:如果
PHP\u INT\u max<($max-$min)
,则需要将间隔加在一起,如PHP7.1之前的.rand()所述。它使用LCG算法,其结果是可预测的输出。它也很慢。由于PHP7.1 rand()是mt_rand()的别名,因此不再糟糕。PHP7还引入了加密安全的random_int(),但是除非必要,否则应该避免使用,因为它比mt_rand()慢得多,你是说更快吗?区别在于(键入==更快vs更快==性能方面)-实际上可以两者兼而有之新的php版本具有加密安全性。对于PHP7+使用
random\u int()
random\u bytes()
,或
openssl\u random\u pseudo\u bytes()
。正如@Salvador Dali所说,
rand()
不会生成加密安全的结果。请参阅文档,这太棒了!但是,除非webhosts在全球范围内更广泛地支持PHP7,否则这对于任何构建产品以供分发的人来说都是无用的。所以前面的答案也适用于PHP7,仍然是最佳实践。@MattCromwell。我不同意你的看法。在托管服务支持PHP7之前,我们应该使用polyfill来实现
random\u int
random\u bytes
功能。我很好奇,有没有理由不使用
random\u int
?如果它给出了“更好”的随机数,为什么不出于非加密的原因使用它呢?@BrianLeishman我宁愿在任何事情上都使用它。我能猜到的唯一缺点是:它可能依赖于随机性的来源,如果没有随机性,它可能会失败。它可能会更昂贵(需要检查),但我怀疑这一个函数是否会有很大的不同。我确实知道它速度较慢,但它不足以让我们返回并将现有的
random\u int
s更改为
rand
s。另外,我的用例是一个重试算法,我绝对不希望由于可预测的随机整数而导致多个失败的函数在睡眠后聚集
$min=1;
$max=20;
echo mt_rand($min,$max);
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;
}
int random_int ( int $min , int $max )
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
}