0

在几乎任何编程语言中,如果我执行 $number = rand(1,100),那么我创建了一个平坦概率,其中每个数字都有 1% 的机会出现。

如果我试图抽象一些奇怪的东西,比如将火箭发射到太空中,那么我想要一个弯曲(或成角度)的概率图。 但我不想要一个“阶梯式”图表。 (重要:我不是数学书呆子,所以可能有些术语或概念我完全跳过或不知道!)虽然角度图很好。

因此,如果我想要一个给出 1 到 100 的结果的概率... 1 将是最常见的结果。2 下一个最常见的。在一条直线上直到某个点 - 假设 50,然后图表角度,并且滚动 51 的概率小于滚动 49 的概率。然后它再次在 75 处倾斜,因此得到高于 75 的结果的概率不是只是 25%,而是一个非常小的数字,具体取决于图表,可能只有 10% 或 5% 左右。

这个问题有意义吗?我特别想看看如何在 PHP 中做到这一点,但我敢打赌,所需的逻辑将是相当可移植的。

4

4 回答 4

2

对您的问题的简短回答是,是的,这是有道理的,是的,这是可能的。

您所说的技术术语是概率密度函数。直观地说,它就是它听起来的样子:它是一个函数,它告诉您,如果您抽取随机样本,这些样本将聚集的密集程度(以及这些集群的样子)。您识别为“平面”的函数也称为均匀的密度;标准库中通常内置的另一个非常常见的分布是“正态”或高斯分布。你已经看到了,它也被称为钟形曲线分布。

但是受到一些限制,您可以拥有任何您喜欢的发行版,并且从另一个发行版构建一个相对简单。

这就是好消息。坏消息是它是数学书呆子的领域。概率密度函数背后的想法非常直观且易于理解,但使用它们的全部功能只有通过一点微积分才能解锁。例如,您的函数的限制之一是总概率必须是统一的,这与说曲线下的面积必须正好是 1 相同。在您描述的确切情况下,该函数都是直线,因此您并不严格需要微积分来帮助您解决该限制……但在一般情况下,您确实可以。

要寻找的两个好术语是“转换方法”(有几个)和“拒绝采样”。拒绝抽样背后的基本思想是你有一个可以使用的函数(在这种情况下,你的均匀分布)和一个你想要的函数。您使用均匀分布来制作一堆点 (x,y),然后使用您想要的函数作为测试与 y 坐标来接受或拒绝 x 坐标。

但是,如果没有图片,这几乎没有任何意义,不幸的是,所有谈论这个问题的最佳方式都是基于微积分的。下面的链接有一个很好的描述和很好的插图。

http://www.stats.bris.ac.uk/~manpw/teaching/folien2.pdf

于 2012-05-20T00:34:45.957 回答
0

本质上,您只需要选择一个随机数,然后输入一个可能是指数的函数来选择该数字。

弄清楚您希望结果的加权程度将使您使用的公式不同。

假设 PHP 有一个随机的双精度函数,我将称它为随机的。

$num = 100 * pow(随机(), 2);

这将导致随机数自身相乘两次,并且由于它返回一个介于 0 和 1 之间的数字,因此它会变小,从而增加成为较小数字的机会。要获得准确的比例,您只需要使用这种格式即可。

于 2012-05-19T04:27:47.070 回答
0

对我来说,您似乎需要一个对数函数(它是弯曲的)。你仍然会拉一个随机数,但你得到的值在大多数情况下会更接近 1 而不是 100。所以我想这可以工作:

function random_value($min=0, $max=100) {
    return log(rand($min, $max), 10) * 10;
}

但是,您可能需要自己调查以确保。

于 2012-05-19T04:28:08.200 回答
0

实现弯曲概率的最简单方法是考虑如何将游戏中的奖品分配给许多赢家和输家。为了简化您的示例,我选择了 16 个玩家和 4 个奖品。然后我制作一个带有奖品符号的数组(1,2,2,3,3,3,3,3,4,4,4,4,4,4,4)并从中随机选择一个数字大批。从数学上讲,奖品 1 = 1:16、奖品 2 为 3:16、奖品 3 为 5:16 和奖品 4 为 7:16 的概率。

于 2012-05-19T07:56:30.760 回答