用PHP将数字分为唯一的随机数

时间:2019-04-20 16:12:51

标签: php

是指关于Divide a single number into a set of unique random numbers in PHP

的旧问题

感谢https://stackoverflow.com/users/1545088/matei-mihai的代码

  function generateRandomNumbers($max, $count){
        $numbers = [];

        for ($i = 1; $i < $count; $i++) {
            $random = mt_rand(0, $max / ($count - $i));
            $numbers[] = $random;
            $max -= $random;
        }
        $numbers[] = $max;
        shuffle($numbers);
        return $numbers;
    }
    echo '<pre>';
    print_r(generateRandomNumbers(100, 10));
    echo '</pre>';

使用上面的编码,如何获得没有零(0)的结果?

更新:如果我将$ max = 10和$ count = 20(generateRandomNumbers(10,20))更改为零,我希望得到除0(零)之外的带小数的结果

Array
(
    [0] => 2
    [1] => 0
    [2] => 1
    [3] => 2
    [4] => 0
    [5] => 1
    [6] => 0
    [7] => 0
    [8] => 0
    [9] => 0
    [10] => 0
    [11] => 0
    [12] => 1
    [13] => 0
    [14] => 3
    [15] => 0
    [16] => 0
    [17] => 0
    [18] => 0
    [19] => 0
)

通过使用这些值generateRandomNumbers(10,20)并具有不带零但带小数的结果吗?

2 个答案:

答案 0 :(得分:0)

您必须使用此代码块。

  function generaenter code hereteRandomNumbers($max, $count){
        $numbers = [];

        for ($i = 1; $i < $count; $i++) {
            $random = mt_rand(1, $max / ($count - $i));
            $numbers[] = $random;
            $max -= $random;
        }
        $numbers[] = $max;
        shuffle($numbers);
        return $numbers;
    }
    echo '<pre>';
    print_r(generateRandomNumbers(100, 10));
    echo '</pre>';

答案 1 :(得分:0)

您可以使用这组代码

 function random_float($min, $max) {
  return random_int($min, $max - 1) + (random_int(0, PHP_INT_MAX - 1) / PHP_INT_MAX );
}

function generateRandomNumbers($max, $count){
$randoms = [];

    for ($i=0; $i <$count ; $i++) {
      if($i>0)
      {
        while(1){
          $this_random = random_float(0.1,$max);
          if(!in_array($this_random,$randoms))
          {
            $randoms[] = $this_random;
            break;
          }
        }
      }
      else {
        $this_random = random_float(0.1,$max);
        $randoms[] = $this_random;
      }
    }
    $numbers = [];
    $sum_of_randoms = array_sum($randoms);
    foreach ($randoms as $key => $value) {
      $numbers[] = ($value/$sum_of_randoms) * $max;
    }
    return $numbers;
  }


echo array_sum(generateRandomNumbers(10,20));
echo '<pre>';
print_r(generateRandomNumbers(10,20));
echo '</pre>';

我现在更新了代码,该代码使特定的浮动随机数数组的总和为$max。您可以实时测试代码here