我需要一个高效的算法来生成不同的组合(不允许重复)。每个组合有 5 个不同的数字(不同的数字),范围在 1 到 99 之间。结果必须存储在一个数组中。如果可能的话,我希望允许自定义数字和范围。数字的顺序无关紧要(01 02 03 = 03 01 02)
Ex.:
01 02 03 04 05
02 03 04 05 06
...
有没有人可以帮助我构建它?我想从数组中选择一些随机组合。现在我正在使用 mt_rand 生成随机组合,但它需要太多时间,太慢了!我相信碰巧经常重复然后需要时间来产生新的和新的...
我很快就把它放在一起了,看起来很管用。
<?php
$range_low = 1;
$range_hi = 99;
$num_sets = 10;
$set = generateSet($range_low, $range_hi, $num_sets);
print_set($set);
function generateSet($range_low, $range_hi, $numSets = 5, $numPerSet = 5)
{
$return = array();
$numbers = array();
for($i = $range_low; $i <= $range_hi; ++$i) {
$numbers[] = $i;
}
for ($s = 0; $s < $numSets; ++$s) {
$set = array_values($numbers);
shuffle($set);
$return[$s] = array();
for ($i = 0; $i < $numPerSet; ++$i) {
$val = array_shift($set);
$return[$s][] = $val;
}
}
return $return;
}
function print_set($set)
{
foreach($set as $subset) {
foreach($subset as $value) {
echo str_pad($value, 2, '0', STR_PAD_LEFT) . ' ';
}
echo "\n";
}
}
示例输出:
90 75 89 43 57
24 54 38 35 10
77 21 55 33 83
37 15 61 09 44
25 31 85 17 20
48 37 45 13 20
82 70 74 64 72
07 24 33 64 45
34 13 39 33 05
13 77 87 70 64
要 Fisher-Yates 打乱数组,请参阅 this comment on shuffle一个你可以用来代替随机播放的功能。
希望对您有所帮助。