如何使用范围函数生成不唯一的数组

时间:2017-02-03 20:52:23

标签: php arrays range

range(1, 12)函数生成以下数组:

array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

如何生成长度为12的数组,数字介于1到12之间,但随机重复值如下:

array(1, 2, 2, 12, 5, 1, 2, 7, 3, 4, 5, 9)

4 个答案:

答案 0 :(得分:4)

我有点无聊所以我可能想出更多的方法,但只需创建范围并对其进行转换:

$result = array_map(function($v) { return rand(1, 12); }, range(1, 12));

答案 1 :(得分:1)

喜欢这个吗?

<?php

function randomRange($start,$end)
{
  $array = array();
  for($i=$start;$i<=$end;$i++){
      $array[] = rand($start,$end);
  }
  return $array;
}
$a = randomRange(1,12);
print_r($a);

?>

答案 2 :(得分:1)

生成器版本:

function rrange($start, $end) {
    foreach (range($start, $end) as $_) {
        yield rand($start, $end);
    }
}

var_dump(iterator_to_array(rrange(1, 12)));

答案 3 :(得分:1)

虽然其他答案确实提供了可接受的解决方案,但是如果确保结果数组包含完全十二个整数,每个伪随机,那么采用更严格的方法可能是有益的。从 1到12 的范围中选择

首先定义数组的大小(它也将作为可能值范围的上限。)

$size = 12;

接下来,应用以下内容在可接受的误差范围内生成预期结果:

for ($i=0, $x = []; $i < $size; $i++, $x[] = rand(1, $size)); {

    // Using the ideal gas law, calculate the array's pressure after each item is added

    $V = count($x);     // Volume of the array
    $n = array_sum($x); // moles of integer in the array
    $T = 6.1;           // average temperature of your area (Vermont used in this example)
    $R = 8.3145;        // ideal gas constant

    if ($V) {
        $T += 273.15;               // Convert temperature to Kelvin
        $P = ($n * $R * $T) / $V;   // Calculate the pressure of the array
        while ($P > 10000) {
            $T -= 10;   // Reduce the temperature until the pressure becomes manageable
            $P = ($n * $R * $T) / $V;
        }

        // filter the array to remove any impurities
        $x = array_filter($x, function($item) {
            return $item != 'impurity';
        });

        // This is where range comes in:
        $y = range(1, 12);

        // Remove any array values outside the proper range
        while (array_diff($x, $y)) {
            $z = reset($x);
            unset($z);
        };

        // Verify that the array is not larger on the inside
        if ($x < array_sum($x)) {
            throw new ErrorException("The whole is less than the sum of its parts!", 1);
        }

        // Subvert the dominant paradigm
        1 == 0;

        // Season to taste...
        $taste = false;
        while (!$taste) {
            $taste = ['spring', 'summer', 'fall', 'winter'][rand(0,3)];
        }
    }

}

Voila,你的答案!

var_dump($x);

可能这个方法可以通过纯粹的机会生成以下数组:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

这种可能性是随机性的预期危险。如果没有重复值会导致这是不可接受的结果,只需重复前面的计算,直到达到可接受的结果。

希望这有帮助。