我想知道是否可以快速生成x
个随机百分比,总计达到100%?
我已经尝试过编写这个函数,但是在前2或3次迭代中100%被用完的时间多了很多次,剩下的只有0%,我想保留所有的百分比高于0.
function randomPercentages($x) {
$percent = 100;
$return = array();
for($i=1; $i <= $x; $i++) {
$temp = mt_rand(1, $percent);
$return[] = $temp;
$percent -= $temp;
}
return $return;
}
print_r(randomPercentages(7));
答案 0 :(得分:5)
步骤1:在0和1之间生成一堆浮点数。(如果你想立即使用百分比,则为0和100)
第2步:对它们进行排序。
编辑:步骤2 1/2:添加0和1以开始和结束列表。
第3步:迭代它们。当前和之前的差异是您的随机百分比。
示例:
0.23, 0.65, 0.77
0.23 - 0.00 = 23%
0.65 - 0.23 = 42%
0.77 - 0.65 = 12%
1.00 - 0.77 = 23%
----
100%
一些未经测试的代码:
$num = 5;
$temp = [0.0];
for ($i=0; $i<$num; $i++) $temp[] = mt_rand() / mt_getrandmax();
sort($temp);
$temp[] = 1.0;
$percentages = [];
for ($i=1; $i<count($temp); $i++) $percentages[] = $temp[$i] - $temp[$i-1];
答案 1 :(得分:3)
我编辑了你的功能,总是达到100%,每个值至少达到1%(但是最后的值通常非常低,并且趋势会随着生成的百分比数而增加):
function randomPercentages($x) {
$percent = 100;
$return = array();
for($i=1; $i <= $x; $i++) {
if($i < $x) {
$temp = mt_rand(1, ($percent-($x-$i)));
} else {
$temp = $percent;
}
$return[] = $temp;
$percent -= $temp;
}
return $return;
}
这是一个经过重写和测试的函数,具有Felk的优秀想法和代码(但零值是可能的):
function randomPercentagesFelk($x) {
$temp[] = 0;
for($i=1; $i<$x; $i++) {
$temp[] = mt_rand(1, 99);
}
$temp[] = 100;
sort($temp);
$percentages = [];
for($i=1; $i<count($temp); $i++) {
$percentages[] = $temp[$i] - $temp[$i-1];
}
return $percentages;
}
我再次重写了#34;将所有百分比保持在0&#34; (它使用高达98%的百分比 - 超过允许的零)。这比我预期的要快:98%的测试环境需要0.01到0.04秒:
function randomPercentagesFelkZero($x) {
$temp[] = 0;
for($i=1; $i<$x; $i++) {
$new = mt_rand(1, 99);
if($i<98) {
while(in_array($new,$temp)) {
$new = mt_rand(1, 99);
}
}
$temp[] = $new;
}
$temp[] = 100;
sort($temp);
$percentages = [];
for($i=1; $i<count($temp); $i++) {
$percentages[] = $temp[$i] - $temp[$i-1];
}
return $percentages;
}
答案 2 :(得分:2)
<?php
//One way to code Felk's solution :
function randomPercentages($x){
$seeds = Array();
for($i=0; $i < $x - 1; $i++){
$seeds[] = rand(0,100);
}
sort($seeds);
$results = [];
for($i=0; $i < $x - 1; $i++){
$last = $i == 0 ? 0 : $seeds[$i-1];
$results[] = $seeds[$i] - $last;
}
$results[] = 100 - $seeds[$x-2];
return $results;
}
print_r(randomPercentages(7));
输出:
Array
(
[0] => 20
[1] => 0
[2] => 12
[3] => 11
[4] => 4
[5] => 28
[6] => 25
)