PHP-相对于模式X

时间:2018-08-01 15:02:10

标签: php random

我正在尝试生成其模式等于 X 的随机数(任何实数)。作为说明,我希望标头为rand(int min, int max, int mode)的函数,并在使用以下参数rand(min: 1, max: 6, mode: 4)进行调用时生成以下内容:

(1,2,4,4,4,5,3) // not exact, but similar

我正在寻找一种优化的方式(尽管手动操作是最坏的情况,但我没想到)。

我检查了mt_rand()rand和其他随机生成函数,但没有找到我想要的东西。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

<?php 

function generateRandomWithMode($min,$max,$mode,$size){
    if(!($mode >= $min && $mode <= $max)){
        throw new Exception("Mode $mode is not between $min and $max range");       
    }

    $half_count = intval($size / 2);

    /* 
        set mode frequency as half of the size + any random value generated between 0 and half_count. This ensures
        that the mode you provided as the function parameter always remains the mode of the set of random values.
    */
    $mode_frequency = $half_count + rand(0,$half_count);

    $random_values = [];
    $size -= $mode_frequency;

    while($mode_frequency-- > 0) $random_values[] = $mode;
    while($size-- > 0) $random_values[] = rand($min,$max);

    shuffle($random_values);
    return $random_values;
}

print_r(generateRandomWithMode(1,100,4,10));

输出

Array
(
    [0] => 4
    [1] => 63
    [2] => 4
    [3] => 4
    [4] => 24
    [5] => 4
    [6] => 4
    [7] => 4
    [8] => 12
    [9] => 4
)