php是否有更好的方法在指定范围内生成随机数

1.指定范围,可小数点后两位,比如范围为0.01-19999.00
2.已经出现过的数字不能在出现,比如已经出现过1.66,23.44,555.33等多个数字
3.随机生成一个在范围内且没出现过的数字

一般的实现方式就是在范围内随机生成一个数字,然后在出现过的数字中循环对比是否重复,如果重复则重新生成,然后在对比,不断循环,直到生成的数字满足条件。

有没有其他更好的方法?有这样的函数吗?

阅读 2.3k
2 个回答

一般方法指的是这个吗:

$NUMBERS = array();
function makeRandomNum() {
    $max = 100;
    $count = 0;
    while ($count < $max) {
        $count += 1;
        $num = rand(1,1999900) * 0.01;
        if (!isset($NUMBERS[$num])) {
            $NUMBERS[$num] = 1;
            return $num;
        }
    }
}

其他方法:

  1. 生成一个拥有所有元素的数组,使用 array_rand() 函数随机取一个,然后在原来数组中删除
  2. 还是生成一个拥有所有元素的数组,然后用 shuffle() 函数打乱, 使用 array_pop() 不断取随机数

不太清楚你用的场景,理论说大多数用fpm,这种情况下一次运行就销毁,程序是不可能记住以往生成过的数字的,必须借助第三方存储机构才行,比如redis甚至是传统数据库。

如果你用常驻内存型的服务,理论上是可以借助php数组来记录保存已经生成过的数字。由于你要求的没有任何其它保证唯一的因素。所以,在我看来,似乎除了你说的办法外,也没有更好的做法。

如果你能加入时间因素,则时间因素天生是具备唯一性的。

推荐问题