【问题标题】:Random selection based off of floating point weight基于浮点权重的随机选择
【发布时间】:2026-02-18 23:40:02
【问题描述】:

假设我有一个包含以下值的数组:

0.7523262
0.9232192
1.5824928
5.2362123

从这个数组中随机选择一个值的最佳方法是什么,以便值越高,被选中的可能性就越大?有一些常用的函数可以进行加权选择,但它们都使用 mt_rand(),它不适用于这样的事情。

例如,值 2.4652474 被选中的可能性是值 1.2326237 的两倍。

【问题讨论】:

  • 如果也是加权的,怎么能随机选择?对于如何进行加权,您是否有一个特定的算法(用简单的英语)?
  • 他们更有可能“如何”重要吗?是否应该按位置(最低,第二低等)线性增加机会(这可能很容易),或者与实际内容线性增加的机会,它们相关的其他方式(如非线性)?它们是否相关并不重要,只是增加机会?
  • @Calvin,你对我的问题有什么不明白的地方?我又读了一遍,对我来说似乎是简单的英语。我想从列表中随机选择一个数字,但数字越大,被选中的可能性就越大。
  • 好吧..你确实在他的评论之后添加了关于它们应该如何关联的解释,所以可能是这样吗?
  • 是的,你在之后添加了解释。

标签: php random


【解决方案1】:

我不知道这是否是最好的方法,但是您可以通过计算数组中所有条目的总和,将其乘以 0 和 1 之间的随机数来获得目标,然后计算数组中所有条目的运行总计,直到该总计超过目标。返回超出目标的条目。

【讨论】:

    【解决方案2】:

    计算0 和整个数组之和之间的随机数。

    对数组进行排序,使较小的数字在前。

    从左边开始对数组求和。当总和大于随机数时,您选择您已达到的索引。

    如果你例如有

    Array = [1, 1.5, 2, 2.5]
    Sum of Array = 7
    Random = 4
    

    我们检查第一个索引。这是在4 之下,所以我们将添加第二个数字1 + 1.5 = 2.5,这不在4 之上,所以我们在4 之上添加另一个数字2.5 + 2 = 4.5,所以我们选择第三个索引。

    【讨论】:

    • 我认为你是对的。我想我有一个排序的计划,但我现在不记得了。