代码之家  ›  专栏  ›  技术社区  ›  ndrwnaguib Nikkolai Fernandez

php-在与模式x相关的间隔内生成随机数

  •  0
  • ndrwnaguib Nikkolai Fernandez  · 技术社区  · 6 年前

    我正在尝试生成其模式等于的随机数 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 回复  |  直到 6 年前
        1
  •  2
  •   nice_dev    6 年前
    <?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
    )