你知道一种方法将一个整数分成说... 5组。 每组总数必须是随机的,但总数必须等于固定数。
例如我有“100”我想把这个号码分成
1- 20
2- 3
3- 34
4- 15
5- 18
编辑:我忘了说是的,余额是一件好事。我想这可以通过制作一个if语句来阻止任何超过30个实例的数字来完成。
答案 0 :(得分:5)
挑选4个随机数,每个数平均为20(分布为例如20的约40%,即8)。添加第五个数字,使总数为100.
在这里回答其他几个答案,实际上最后一个数字不能是随机的,因为总和是固定的。作为解释,在下面的图像中,只有4个点(较小的刻度)可以随机选择,累计表示,每个平均值附加一个随机数(总/ n,20),总和为100。结果是5个间距,代表您要查找的5个随机数。
答案 1 :(得分: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;
}
}
生成结果的示例将看起来像这样。很随意。
[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)
}
答案 2 :(得分:4)
我对这里的一些答案略有不同。我根据您想要求和的项目数量创建一个宽松的百分比,然后随机加上或减去10%。
然后我这样做n-1次(n是迭代的总数),所以你有一个余数。其余的是最后一个数字,它本身并不是随机数,而是基于其他随机数。
效果很好。
/**
* 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;
}
此:
$random = $this->_random_numbers_sum();
echo 'Total: '. array_sum($random) ."\n";
print_r($random);
输出:
Total: 500
Array
(
[0] => 167
[1] => 164
[2] => 169
)
答案 3 :(得分:3)
$number = 100;
$numbers = array();
$iteration = 0;
while($number > 0 && $iteration < 5) {
$sub_number = rand(1,$number);
if (in_array($sub_number, $numbers)) {
continue;
}
$iteration++;
$number -= $sub_number;
$numbers[] = $sub_number;
}
if ($number != 0) {
$numbers[] = $number;
}
print_r($numbers);
答案 4 :(得分:1)
这应该做你需要的:
<?php
$tot = 100;
$groups = 5;
$numbers = array();
for($i = 1; $i < $groups; $i++) {
$num = rand(1, $tot-($groups-$i));
$tot -= $num;
$numbers[] = $num;
}
$numbers[] = $tot;
但是,它不会给你一个真正平衡的分布,因为第一个数字平均会更大。
答案 5 :(得分:0)
我认为这样做的诀窍是将随机#生成器的上限设置为100 - currentTotal
答案 6 :(得分:0)
我发现这个问题的解决方案有点不同,但是对我来说更有意义,所以在这个例子中我生成了一个数组,加起来达到960.希望这有用。
// the range of the array
$arry = range(1, 999, 1);
// howmany numbers do you want
$nrresult = 3;
do {
//select three numbers from the array
$arry_rand = array_rand ( $arry, $nrresult );
$arry_fin = array_sum($arry_rand);
// dont stop till they sum 960
} while ( $arry_fin != 960 );
//to see the results
foreach ($arry_rand as $aryid) {
echo $arryid . '+ ';
}
答案 7 :(得分:0)
解决方案取决于你希望你的值如何 random ,换句话说,你要模拟的随机情况。
要获得完全随机分布,您必须进行100次民意调查,其中每个元素将以符号语言绑定到一个组
foreach i from 1 to n
group[ random(1,n) ] ++;
对于较大的数字,您可以将选定的组增加random(1, n/100)
或类似的值,直到总和与n匹配。
但是,你想获得平衡,所以我认为对你来说最好的是正态分布。绘制5个高斯值,将数字(它们的总和)分成5个部分。现在你需要缩放这些部分,使它们的总和为n并围绕它们,所以你得到了5个组。