caw*_*caw 3 php random algorithm statistics
几天前,你帮助我找到了一个在线游戏中产生随机强度值的算法(尤其是John Rasch).
function getRandomStrength($quality) {
$rand = mt_rand()/mt_getrandmax();
$value = round(pow(M_E, ($rand - 1.033) / -0.45), 1);
return $value;
}
Run Code Online (Sandbox Code Playgroud)
此函数生成介于1.1和9.9之间的值.现在我想调整这个函数,以便它给出相同概率的值但在另一个区间,例如1.5到8.0.如果您可以通过其他参数实现这一点,那将是完美的.
如果你能帮助我会很棒.提前致谢!
原始代码中的值1.033和-0.45是提供标度1.1 - 9.9的幻数.如果传入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;
}
Run Code Online (Sandbox Code Playgroud)
你应该能够在任何范围的传递$low
和$high
并获得在该范围内的对数分布.(我会给你留下范围有效性检查,但0 $low
<< $high
应该是真的.)
这通过反向计算在所提供的范围内生成对数标度所需的线性标度来工作.例如,如果我希望我的对数比例为1.1 - 9.9,我会得到每个值的自然对数,给我0.0953 - 2.2925.然后,我在此线性范围内生成一个随机数,并提升e
到随机功率,将其转换回日志范围.