php - 调整生成随机强度值的算法

标签 php algorithm random statistics

几天前,you helped me to find out an algorithm for generating random strength values in an online game (thx especially John Rasch) .

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/

相关文章:

PHP5 性能比较,Windows 和 Linux

javascript - 循环中的 Bootstrap Popover 未显示正确的内容

php - 使用 PHP 数组将 null 插入 MySQL。 PDO 准备好的报表

php - 移除顶层数组并将子数组合并为一个

algorithm - 检查一个值是否属于哈希

c++ - 使用转换填充 vector 后,新的 c++11 for 循环不起作用

java - 从 N 叉树中随机选择一个节点

java - 为什么我的removeDuplicates方法仅在第一次遇到重复整数时删除它?

c++ - 生成随机数的代码C++

random - 使用 crypto/rand 通过 rand.Perm 生成排列