如何制作5个随机数,总和为100

San*_*cci 5 php random

你知道一种方法将一个整数分成说... 5组.每组总数必须是随机的,但它们的总数必须等于固定数.

例如,我有"100"我想把这个数字分成

1- 20
2- 3
3- 34
4- 15
5- 18
Run Code Online (Sandbox Code Playgroud)

编辑:我忘了说是的,余额是一件好事.我想这可以通过制作一个if语句来阻止任何超过30个实例的数字来完成.

Rem*_*emi 5

挑选4个随机数,每个数平均为20个(例如,分布约为20的20%,即8).添加第五个数字,使总数为100.

在这里回答其他几个答案,实际上最后一个数字不能是随机的,因为总和是固定的.作为解释,在下面的图像中,只有4个点(较小的刻度)可以随机选择,累计表示,每个平均值附加一个随机数(总/ n,20),总和为100.结果是5个间距,代表您要查找的5个随机数.

0到100之间只有4个随机点


Mik*_*ike 5

对于这里的某些答案,我有稍微不同的方法。我根据要累加的项目数创建一个宽松的百分比,然后随机增加或减少10%。

然后,我将其执行n-1次(n是迭代的总数),因此有余数。剩下的就是最后一个数字,它本身并不是真正的truley随机数,但是它基于其他随机数。

效果很好。

/**
 * Calculate n random numbers that sum y.
 * Function calculates a percentage based on the number
 * required, gives a random number around that number, then
 * deducts the rest from the total for the final number.
 * Final number cannot be truely random, as it's a fixed total,
 * but it will appear random, as it's based on other random
 * values.
 * 
 * @author Mike Griffiths
 * @return Array
 */
private function _random_numbers_sum($num_numbers=3, $total=500)
{
    $numbers = [];

    $loose_pcc = $total / $num_numbers;

    for($i = 1; $i < $num_numbers; $i++) {
        // Random number +/- 10%
        $ten_pcc = $loose_pcc * 0.1;
        $rand_num = mt_rand( ($loose_pcc - $ten_pcc), ($loose_pcc + $ten_pcc) );

        $numbers[] = $rand_num;
    }

    // $numbers now contains 1 less number than it should do, sum 
    // all the numbers and use the difference as final number.
    $numbers_total = array_sum($numbers);

    $numbers[] = $total - $numbers_total;

    return $numbers;
}
Run Code Online (Sandbox Code Playgroud)

这个:

$random = $this->_random_numbers_sum();
echo 'Total: '. array_sum($random) ."\n";
print_r($random);
Run Code Online (Sandbox Code Playgroud)

输出:

Total: 500
Array
(
    [0] => 167
    [1] => 164
    [2] => 169
)
Run Code Online (Sandbox Code Playgroud)


Gaj*_*jus 4

根据您需要的随机性以及您计划运行脚本的环境的资源丰富程度,您可以尝试以下方法。

<?php
set_time_limit(10);

$number_of_groups   = 5;
$sum_to             = 100;

$groups             = array();
$group              = 0;

while(array_sum($groups) != $sum_to)
{
    $groups[$group] = mt_rand(0, $sum_to/mt_rand(1,5));

    if(++$group == $number_of_groups)
    {
        $group  = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

生成结果的示例将如下所示。相当随机。

[root@server ~]# php /var/www/dev/test.php
array(5) {
  [0]=>
  int(11)
  [1]=>
  int(2)
  [2]=>
  int(13)
  [3]=>
  int(9)
  [4]=>
  int(65)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
  [0]=>
  int(9)
  [1]=>
  int(29)
  [2]=>
  int(21)
  [3]=>
  int(27)
  [4]=>
  int(14)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
  [0]=>
  int(18)
  [1]=>
  int(26)
  [2]=>
  int(2)
  [3]=>
  int(5)
  [4]=>
  int(49)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
  [0]=>
  int(20)
  [1]=>
  int(25)
  [2]=>
  int(27)
  [3]=>
  int(26)
  [4]=>
  int(2)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
  [0]=>
  int(9)
  [1]=>
  int(18)
  [2]=>
  int(56)
  [3]=>
  int(12)
  [4]=>
  int(5)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
  [0]=>
  int(0)
  [1]=>
  int(50)
  [2]=>
  int(25)
  [3]=>
  int(17)
  [4]=>
  int(8)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
  [0]=>
  int(17)
  [1]=>
  int(43)
  [2]=>
  int(20)
  [3]=>
  int(3)
  [4]=>
  int(17)
}
Run Code Online (Sandbox Code Playgroud)