【问题标题】:How to Generate an Array of Random Number Sets in PHP?如何在 PHP 中生成随机数集数组?
【发布时间】:2020-01-30 15:25:47
【问题描述】:

我试图找出从一个范围内创建一组随机选择的数字的数组的最佳方法。因此,例如,我有一个可供选择的数字范围:1-100。我想生成 X 组,每组 5 个,没有重复。所以,我想生成类似的东西:

[3, 24, 32, 49, 68]

[2, 18, 43, 76, 98]

[10, 12, 23, 45, 67]

[5, 56, 64, 72, 90]

...

我知道如何从一个范围内生成随机数一次,我只是坚持做 X 次,没有重复集合的可能性。

【问题讨论】:

  • 如果您删除所谓的“重复集”,那么它就不是真正的随机。为了得到你想要的,你可以从较大的集合中生成一个集合,从较小的集合中删除数字,然后生成下一个集合 - 冲洗、起泡、重复。
  • 只是在这里回答这个问题,因为老实说我认为这个问题不应该被关闭:$a = range(1, 100); shuffle($a); $sets = array_chunk($a, 5); var_dump($sets); Cheers!
  • @Sherif 同意,这不应该作为副本关闭。投票决定重新开放。还有一个很好的解决方案,如果它重新打开,作为答案发布
  • 重新打开了这个问题 - 我同意这不是它被关闭的重复。

标签: php random


【解决方案1】:

解决此问题的一种方法是简单地生成所需的范围$arr = range(1, 100),然后将其随机化以随机化shuffle($arr),然后将其分块以获得5个$sets = array_chunk($arr, 5)的集合。

所以最后的答案:

$arr = range(1, 100); // gives us an array of 100 integers 1-100
shuffle($arr); // randomly orders those integers
$sets = array_chunk($arr, 5); // creats an array of arrays of sets of 5 integers

foreach ($sets as $set) {
    echo implode(',', $set), "\n";
}

给你类似的东西......

14,24,60,95,86 47,54,10,77,3 11,22,88,80,39 72,46,81,78,59 63,98,52,82,8 79,34,43,13,41 67,33,75,1,2 4,57,84,73,17 32,55,35,18,70 64,85,100,93,71 25,19,26,20,76 99,89,7,87,91 37,97,68,27,5 74,48,65,61,58 45,31,9,30,21 16,56,50,96,90 92,40,6,44,23 28,94,38,83,29 36,62,51,66,15 12,69,49,42,53

替代实现

解决此问题的另一种方法是使用哈希集跟踪所有随机生成的整数以防止重复,这种方法不需要一次将整个数组写入内存然后随机使用它。这给了我们相同的确切结果,除了我们在一个步骤中而不是两个步骤中完成随机数生成和排序。您甚至可以通过这种方式在同一步骤中进行分块。

但请记住,该解决方案在技术上较慢,因为它处于无限时间(我们必须不断猜测该数字是否已经存在)。

我将使用生成器来实现这个解决方案,因为它比Iterator 模式更容易编写。

function randomizeIntegerXRangeChunked($start, $end, $chunks = 5): Generator
{
    $inSet = []; // track the integers already in the set

    for ($i = $start, $c = 0; $i <= $end; $i++) {
        /* solution is in unbounded time */
        while (isset($inSet[($n = mt_rand($start, $end))]));

        $inSet[$n] = true;

        yield $c => $n;

        if (!($i % $chunks)) {
            $c++;
        }
    }
}


$arr = [];

foreach (randomizeIntegerXRangeChunked(1, 100, 5) as $chunk => $int) {

    $arr[$chunk][] = $int;

}

var_dump($arr);

输出将类似于...

数组(20){ [0]=> 数组(5){ [0]=> 整数(43) [1]=> 整数(52) [2]=> 整数(38) [3]=> 整数(73) [4]=> 整数(55) } [1]=> 数组(5){ [0]=> 整数(59) [1]=> 整数(3) [2]=> 整数(71) [3]=> 整数(47) [4]=> 整数(50) } [2]=> 数组(5){ [0]=> 整数(54) [1]=> 整数(19) [2]=> 整数(60) [3]=> 整数(40) [4]=> 整数(5) } [3]=> 数组(5){ [0]=> 整数(26) [1]=> 整数(46) [2]=> 整数(93) [3]=> 整数(80) [4]=> 整数(63) } [4]=> 数组(5){ [0]=> 整数(18) [1]=> 整数(45) [2]=> 整数(98) [3]=> 整数(1) [4]=> 整数(72) } [5]=> 数组(5){ [0]=> 整数(37) [1]=> 整数(97) [2]=> 整数(15) [3]=> 整数(68) [4]=> 整数(8) } [6]=> 数组(5){ [0]=> 整数(34) [1]=> 整数(14) [2]=> 整数(33) [3]=> 整数(24) [4]=> 整数(65) } [7]=> 数组(5){ [0]=> 整数(4) [1]=> 整数(16) [2]=> 整数(13) [3]=> 整数(41) [4]=> 整数(86) } [8]=> 数组(5){ [0]=> 整数(95) [1]=> 整数(12) [2]=> 整数(44) [3]=> 整数(66) [4]=> 整数(83) } [9]=> 数组(5){ [0]=> 整数(67) [1]=> 整数(48) [2]=> 整数(91) [3]=> 整数(27) [4]=> 整数(79) } [10]=> 数组(5){ [0]=> 整数(56) [1]=> 整数(25) [2]=> 整数(2) [3]=> 整数(64) [4]=> 整数(78) } [11]=> 数组(5){ [0]=> 整数(57) [1]=> 整数(17) [2]=> 整数(74) [3]=> 整数(42) [4]=> 整数(69) } [12]=> 数组(5){ [0]=> 整数(96) [1]=> 整数(20) [2]=> 整数(9) [3]=> 整数(28) [4]=> 整数(7) } [13]=> 数组(5){ [0]=> 整数(30) [1]=> 整数(75) [2]=> 整数(21) [3]=> 整数(6) [4]=> 整数(89) } [14]=> 数组(5){ [0]=> 整数(51) [1]=> 整数(36) [2]=> 整数(62) [3]=> 整数(58) [4]=> 整数(23) } [15]=> 数组(5){ [0]=> 整数(85) [1]=> 整数(32) [2]=> 整数(100) [3]=> 整数(61) [4]=> 整数(49) } [16]=> 数组(5){ [0]=> 整数(39) [1]=> 整数(87) [2]=> 整数(76) [3]=> 整数(70) [4]=> 整数(22) } [17]=> 数组(5){ [0]=> 整数(88) [1]=> 整数(77) [2]=> 整数(10) [3]=> 整数(99) [4]=> 整数(53) } [18]=> 数组(5){ [0]=> 整数(94) [1]=> 整数(35) [2]=> 整数(92) [3]=> 整数(90) [4]=> 整数(84) } [19]=> 数组(5){ [0]=> 整数(81) [1]=> 整数(82) [2]=> 整数(31) [3]=> 整数(29) [4]=> 整数(11) } }

【讨论】:

    【解决方案2】:

    你也可以这样试试。

    // Array
    $NumberArray = array();
    $TempArray = array(); // Used for storing randoms while we check via if statement.
    
    // Loop 5 times.
    for ($x=0; $x<=4; $x++) {
    
        // Random Number 1-100
        $RandomNumber = rand(1,100);
    
        // We can use Array Push to add to the array and check using in_array.
        array_push($TempArray, $RandomNumber);
    
        // Check first thing in temp array and see if its already in number array. (If not then push)
        if (!in_array(reset($TempArray), $NumberArray)) { 
            array_push($NumberArray, reset($TempArray)); // Add to NumberArray
            // Clear Temp Array
            $TempArray = array();
        } else {
            // Add to the loop
            $x--;
        }
    
    }
    
    print_r($NumberArray);
    

    这样输出一个数组:

    Array
    (
        [0] => 32
        [1] => 26
        [2] => 59
        [3] => 96
        [4] => 34
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-05
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多