function getRandomStrength($quality) {
$rand = mt_rand()/mt_getrandmax();
$value = round(pow(M_E, ($rand - 1.033) / -0.45), 1);
return $value;
}
此函数生成的值介于 1.1 和 9.9 之间。现在我想调整这个函数,让它给我相同概率但在另一个区间内的值,例如1.5 至 8.0。如果您可以通过额外的参数实现这一点,那就太完美了。
如果你能帮助我,那就太好了。提前致谢!
最佳答案
原始代码中的值 1.033 和 -0.45 是提供范围 1.1 - 9.9 的魔数(Magic Number)。如果在以下代码中将 1.1 和 9.9 作为参数 $low
和 $high
传递,您应该会得到相同的结果。
function getRandomStrength($low, $high) {
// TODO: validate the input
$ln_low = log( $low, M_E );
$ln_high = log( $high, M_E );
$scale = $ln_high - $ln_low;
$rand = ( mt_rand() / mt_getrandmax() ) * $scale + $ln_low;
$value = round( pow( M_E, $rand), 1 );
return $value;
}
您应该能够传递 $low
和 $high
的任何范围,并获得该范围内的对数分布。 (我会把范围有效性检查留给你,但是 0 <$low
<$high
应该是真的。)
这是通过反向计算在提供的范围内生成对数刻度所需的线性刻度来工作的。例如,如果我希望我的对数比例为 1.1 - 9.9,我将对每个值取自然对数,得到 0.0953 - 2.2925。然后,我在此线性范围内生成一个随机数,并将e
提高到随机幂以将其转换回对数范围。
关于php - 调整生成随机强度值的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/946361/