3

我需要某种概率的算法(在Java中,但理论应该很笼统)......事情。我什至不知道该怎么称呼它,这就是为什么我没有运气谷歌搜索。

为了更好地描述,我有一个任务需要在调用函数时完成 X 次。有时,发生这种情况的几率只有十分之一,这意味着(大约)每十次调用该函数的时候就有一个会实际执行该任务 - 使用 random() 很容易做到。有时它会是十分之二,甚至可能是十分之十。仍然很容易,直接的条件,即使它并不总是“10中的X”

问题是,它可能有大于1 比 1 的机会。它可能是 10 分之 15 - 运行一次的时间的一半,其余的运行两次。或 5 分之 10,每次调用它都会运行两次(大约)。如您所见,这已经脱离了简单的不等式测试。

所以,我正在寻找的是一些算法,它基于随机数,将根据应该发生的频率(十分之一、200%、0.75,无论格式如何)返回运行计数。如果有人可以提供任何线索 - 比如,也许是一个要搜索的实际术语 - 将不胜感激!

编辑:难怪我找不到很多结果,每个人都和我一样困惑!

首先,没有真正的“最大”价值。没有正式定义。如果算法可以从它接收到的概率值中提取出来,那就太好了。

它也绝对需要是随机的,使其本质上是不完美的。如果你掷硬币 10 次,你很可能会得到 8 个正面,尽管理论上它应该是完全均匀的!没关系。事实上,这就是重点。

我可以告诉你我为什么需要它......但这会违反正确的面向对象的模块化实践:) 外部各方只需要知道接口;它接受一个值(可能是一个浮点数,“0.75”似乎效果最好)并返回一个 int。如果你以五分之一的概率调用它 100 次,它的返回值的总和应该平均为 20。

4

4 回答 4

12

根据您所说,您可以使用几乎任何具有均值的离散概率分布来选择重复次数X

我特别推荐使用均值的泊松分布,因为它模拟了任何给定窗口中的事件数量,当事件在较长时间内独立均匀分布时。因此它具有“可扩展”的特性:你可以除以2,运行你的操作的频率是两倍,你仍然有基本相同的事件模式。[*]X[**]X

如果您并不真正关心分布,您只需要正确的事件发生率,那么在相反的极端情况下,您可以使用完全非随机的算法。保持从 0 开始的累积“进位值”。然后在每次迭代中添加X进位值,返回整数部分并结转小数部分。当然,这使得 8/10 正面是不可能的。

[*]遗憾的是,这个名字并不是因为它是垂钓者在单位时间内捕获的鱼数量的分布。

[**]也与鱼无关。

于 2013-01-24T14:26:38.320 回答
3

如果将给定概率 X 的执行次数限制为floor(X)ceil(X)(并且永远不会floor(X)-1或更少或ceil(X)+1更多):(所以 1.5 是 50% 1 和 50% 2 并且 0.7 是 70% 1 和 30% 0)

int runCount = (int)probability;
if (randomGen.nextDouble() < probability - runCount)
  runCount++;

编辑:根据 DigitalMan 的建议浓缩。

编辑 2:诚然,该解决方案的重点是问题中的“10 分之 15 - 运行一次的一半时间,其余运行两次”,并且可以被认为是替换“5 分之 10”中的“大约”,它每次调用时都会运行两次(大约)在“完全”的问题中。约束有些不清楚。

于 2013-01-24T14:12:45.520 回答
0

嗯……可能,这真的不是概率。
据我所知,您希望有可能在每个函数调用上多次运行您的任务(0...n),从而在此调用中保持随机性。
我能看到的最简单的方法是使用 2 随机化:

  1. 使用 random() 选择是否运行您的任务(比如说,选择从 0 到 100 的随机整数,如果它更大,则必须运行一些 N - 任务)。改变那些 N 你就可以调整你的概率;
  2. 如果在第一步您选择运行任务,请再次运行 random()。可以说,从 100 到 500 的随机整数。可以说它返回数字 R。然后 R%100 将是您应该运行任务的次数。

其他情况是简单地从 0 到 700 的 random() (例如)并使用 random()%100 来定义您应该运行任务的次数。如果您想更改其他值的“概率”,只需使用您自己的函数代替“%”。

于 2013-01-24T14:04:19.030 回答
0

让我们稍微重申一下这个问题,以澄清发生了什么。在每个步骤中,您都希望多次执行该任务。您使用概率分布来描述执行任务的次数。选择您的概率分布,以便它执行正确的预期任务数量。

当您描述在 10 次中执行任务 1 次时,您的分布是您有 90% 的机会执行任务 0 次和 10% 的机会执行一次。这给出了步数十分之一的期望值。将其概括为您的“超过 100% 的时间”,即您希望执行任务次数的期望值等于步数的 1.5 倍。选择一个给出期望值的概率分布,无论是你做一次任务的一半时间和两次任务的一半时间,或者你不做任务的时间的 3/4 和你做任务的时间的 1/4 6次。您通常会有不止一种概率分布有效。

于 2013-01-24T14:13:17.343 回答