我正在尝试生成其模式等于 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
和其他随机生成函数,但没有找到我想要的东西。
有什么建议吗?
答案 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
)