php怎么随机数不重复
时间 : 2023-04-24 23:34:02声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在 PHP 中,可以使用 `mt_rand()` 函数和数组来生成不重复的随机数。

`mt_rand()` 函数是一个基于 Mersenne Twister 算法的伪随机数生成器,可以用于生成指定范围内的随机整数。

具体实现步骤如下:

1. 定义一个空数组 `$nums`,用于存储生成的随机数。

2. 使用 `mt_rand()` 函数生成一个随机数 `$num`,判断是否已经存在于数组 `$nums` 中,如果不存在,则将该数加入数组中,否则重新生成一个随机数。

3. 重复步骤 2 直到生成所需个数的随机数。

示例代码如下:

```php

/**

* 生成 $count 个不重复的随机数

*

* @param int $count 需要生成的随机数个数

* @param int $min 随机数范围的最小值

* @param int $max 随机数范围的最大值

* @return array 生成的随机数数组

*/

function generateUniqueRandomNumbers($count, $min, $max) {

$nums = array();

while (count($nums) < $count) {

$num = mt_rand($min, $max);

if (!in_array($num, $nums)) {

$nums[] = $num;

}

}

return $nums;

}

// 生成 5 个在 1 到 50 之间不重复的随机数

$nums = generateUniqueRandomNumbers(5, 1, 50);

print_r($nums);

运行结果类似如下:

Array

(

[0] => 31

[1] => 24

[2] => 49

[3] => 16

[4] => 6

)

这样就可以在 PHP 中生成指定范围内的不重复随机数了。

在 PHP 中生成随机数可以使用 `rand()` 或者 `mt_rand()` 函数,但是这些函数无法确保生成的随机数不重复。如果你需要生成一些不重复的随机数,可以使用以下两种方法:

1. Fisher-Yates 算法

Fisher-Yates 算法是一种随机置换算法,可以用于将一个数组随机排序。我们可以使用这个算法生成一组不重复的随机数。具体实现方法如下:

```php

function fisher_yates_shuffle($arr) {

$count = count($arr);

for($i = $count - 1; $i > 0; $i--) {

$j = mt_rand(0, $i);

$tmp = $arr[$i];

$arr[$i] = $arr[$j];

$arr[$j] = $tmp;

}

return $arr;

}

// 生成一组不重复的随机数

$arr = range(1, 10);

$shuffle_arr = fisher_yates_shuffle($arr);

在这个函数中,我们首先生成一个包含从 1 到 10 的整数的数组,然后使用 Fisher-Yates 算法将数组随机排序,最后返回这个随机排序后的数组。

2. 洗牌算法

洗牌算法是一种生成不重复随机数的高效算法。它的基本思想是:生成一组序列,然后将这些序列随机交换位置,最后取出前面的若干个数作为不重复随机数。具体实现如下:

```php

function shuffle_array($arr, $num) {

$count = count($arr);

for($i = 0; $i < $count; $i++) {

$j = mt_rand(0, $count - 1);

$tmp = $arr[$i];

$arr[$i] = $arr[$j];

$arr[$j] = $tmp;

}

return array_slice($arr, 0, $num);

}

// 生成一组不重复的随机数

$arr = range(1, 10);

$shuffle_arr = shuffle_array($arr, 5);

在这个函数中,我们首先生成一个包含从 1 到 10 的整数的数组,然后使用洗牌算法将数组随机打乱,最后取出前面的 5 个数作为不重复随机数。

无论是用 Fisher-Yates 算法还是洗牌算法,都可以生成一组不重复的随机数,但是如果需要生成的随机数比较多,或者需要在每次运行程序时生成不同的随机数,这些算法可能效率比较低。如果你需要高效地生成大量不重复的随机数,可以考虑使用哈希算法或者 bloom filter 算法。