PHP生成随机百分比

时间:2015-08-20 17:30:02

标签: php

我想知道是否可以快速生成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));

3 个答案:

答案 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
)