【问题标题】:Php random number generatephp随机数生成
【发布时间】:2015-02-22 09:16:43
【问题描述】:

我的任务:

生成 1 到 20 之间的随机数,精确到小数点后 1 位。

但是我的问题就像 mt_rand 一样简单。我希望生成的大多数数字都低于 0.5 - 4.5 左右,偶尔的数字在 4.5-10 之间,很少说每 12-20 小时一次在 10-20 之间。

我一直在使用以下内容,但不知道从哪里开始。我是一个非常基础的自学程序员。

$min = 1;
$max = 20;
$suisse_interest = mt_rand ($min*10, $max*10) / 10

也许如果我简要解释一下我为什么要这样做可能会有所帮助..

我拥有一个在线游戏,想添加 3 个“银行”,每个银行每小时产生不同的利息。大多数时候我希望它很低,但有时会更高,而且很少非常高 (15-20%)。

使用上面的代码,随机数会变得太频繁。

非常感谢任何帮助!

【问题讨论】:

  • 由于您要创建的分布是monotone decreasing,您可以使用ziggurat algorithm 将您的分布(统​​一)映射到您想要的分布(可以任意创建)。或者您可以使用 box muller 转换,但它的效率较低(而且由于您经常这样做,您可能需要预先计算 ziggurat 算法中描述的表格)。

标签: php random


【解决方案1】:

您需要进行指数计算。如果您使用类似于以下函数的函数,则小数的概率会增加。当然,您需要稍微调整数字以提供适合您需求的输出。

$i = 0;
while($i<30) {
    $i++;
    $rand = mt_rand(0, 7000) / 100; // 0.0 ~ 70.0
    // This is the most important line:
    $output = round( 20*(pow(0.95,$rand)) , 1);
    echo "$output ";
}

样本输出:

1.8 4.3 2.6 5.5 3.7 15.5 1.6 0.6 0.6 1.6 5.8 1.3 6.1 3.2 0.8 1.7 14.7 7.9 1.3 10.3 5.5 12.6 1.5 8.4 1.5 0.9 13.3 5.8 7.5 1.7

如您所见,打印的数字大多较小。

在我的代码中,获得20 的概率约为1.4%,而获得数字smaller than 5 的概率约为78%

【讨论】:

  • 完美,这个和另一个答案都有效。正是我所追求的!谢谢!
【解决方案2】:

试试这个。1.0~4.5的概率在96%左右,4.5~10.0在2%左右,10.0~20.0在2%左右。

<?php
    // 1.0~4.5    96%
    // 4.5~10.0   2%
    // 10.0~20.0  2%

    function fun() {
        $num = mt_rand(1, 100);
        if ($num > 0 && $num <= 96) {
            $return = mt_rand(10, 45) / 10;  // 96%
        } else if ($num > 96 && $num <= 98) {
            $return = mt_rand(45, 100) / 10;  // 2%
        } else {
            $return = mt_rand(100, 200) / 10;  // 2%
        }
        return sprintf("%01.1f",$return);
    }

    echo fun();
?>

【讨论】:

  • 非常感谢,这对您有很大帮助。现在一切都变得更有意义了!
  • 如果您不介意,再问一次。如何获取 echo fun() 并将其放入我的数据库中。我知道下面的内容没有意义,但也许它会让我的目标更清晰.. $interest = (the result of fun()) mysql_query("UPDATE r$game[0]_$tab[pimp] SET suisseint=$感兴趣的地方 id=$user1no[id];");谢谢!
  • 春节来晚了,不好意思。你的SQL是对的,检查表结构再试一次。
【解决方案3】:

这不是 PHP 特有的问题。

您需要的是一个非线性概率定律,然后您可以在 PHP 中实现它。

如果您想要以平均值为中心的东西,理想的选择是gaussian aka normal distribution,但计算它需要各种复杂的技巧,其中大多数都以增加复杂性为代价进行优化以快速生成。

如果您每小时只生成几个值,则性能不会成为问题。

一个合理的近似值是将 3 或 4 个随机变量相加,利用 central limit theorem

将 0 到中间速率两倍之间的随机值相加将创建以中间值为中心的高斯近似值。 如果您不想要低利率,则可以将低于中间点的值钳位。最终结果将是 50% 的机会获得中等利率,而稳步下降的机会达到该值的两倍。

越来越多的总和将“缩小”曲线,使其不太可能获得高值。

例如:

define ("INTEREST_MEAN", 10);
define ("INTEREST_SPREAD", 5);
function random_interest ()
{
    $res = 0;
    for ($i = 0 ; $i != INTEREST_SPREAD ; $i++) $res += mt_rand(0, 2*INTEREST_MEAN);
    $res /= INTEREST_SPREAD; // normalize the sum to get a mean-centered result
    $res = max ($res, INTEREST_MEAN); // clamp lower values
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2016-10-07
    • 2013-01-09
    • 1970-01-01
    相关资源
    最近更新 更多