php - 生成不同的组合 PHP

标签 php algorithm brute-force

<分区>

我需要一个高效的算法来生成不同的组合(不允许重复)。每个组合有 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一个你可以用来代替随机播放的功能。

希望对您有所帮助。

关于php - 生成不同的组合 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9137880/

相关文章:

security - 防止网站上的暴力登录

security - 如何防止暴力攻击?

java - 如何停止递归?

php - Jquery - 从 mysql 查询获取数据

php - 如何验证名称字段以避免数字

c++ - 实现相等算法

python - 从总值最高的 2 个数组中从 N 个数字中选择 k 个

php - 数据库不对数组数据集执行 INSERT

javascript - 使用 php 等待 10 秒后下载 html 文档的特定部分

algorithm - 更快计算机上的复杂度等级