【问题标题】:percent chance logic issue/refactoring (javascript)百分比机会逻辑问题/重构(javascript)
【发布时间】:2011-11-28 18:30:24
【问题描述】:

我有一个数字数组,每个数字都代表重量。数组中的数字介于 0 和 1 之间,这些数字的总和为 1。因此,如果说 array[1] 为 0.6,则表示我希望它显示大约 60% 的时间。我不知道数组本身,所以我不知道这些数字,例如它们是用户输入。

我有一个可行的解决方案,但我不知道这是否是最有效的方法。我的解决方案似乎非常低效。在这里

  • 生成随机数
  • 将此用户输入数组复制到一个新数组中并从小到大排序
  • 将随机数与这个新数组中的数字进行比较,因此它会从数组中的最小值到最大值进行比较,当随机数小于数组号时,我会将数组号存储到一个变量中,比如 x 和退出循环
  • 最后,我将 x 与原始数组进行比较,以确定 x 在原始数组中的索引是什么

这似乎需要做很多工作,有没有更简单的解决方案?我的头转得没那么快

编辑 - 原始数组未以任何方式排序

编辑 2 - 基本上我无法将此随机数与未排序的数组进行比较。我需要未排序的保持不变,这就是我在逻辑中创建新数组的原因

【问题讨论】:

  • 你想做什么?
  • 找出生成的随机数相对于数组的位置。这是一个旋转器,我需要找到要旋转的第一张幻灯片,通过机会/重量找到它。
  • 你能发布一些代码吗?可以帮助其他人解决问题。
  • 所以如果我有数组 [0.1, 0.5, 0.4],如果我的随机数是 0.6,那么我希望显示 0.5 的幻灯片,如果我的随机数是 0.3,那么它应该是 0.4 的幻灯片与有关
  • @RubbleFord 我没有写代码,因为我认为我的方法不好,我只需要弄清楚更好的逻辑然后我会写我的代码

标签: javascript logic


【解决方案1】:

如果你有一个元素总和为 1 的数组,你可以使用以下算法:

  1. 在 0 和权重总和之间选择一个均匀分布的(伪)随机数 r。
  2. 对于每个重量,
    • 如果 r 小于重量,则捡起它并退出。
    • 否则从 r 中减去权重,因此它现在介于 0 和剩余权重的总和之间。

由于 r 始终介于 0 和剩余权重的总和之间,因此当循环达到该权重时,r 总是有可能与每个权重成正比。

在 JavaScript 中:

var weights = [0.5, 0.15, 0.3, 0.05];
var index = weights.length - 1;  // Last by default to avoid rounding error.
var r = Math.random();

for (var i = 0; i < a.length - 1; ++i) {
  if (weights[i] > r) { index = i; break; }
  // The rest of the array sums to 
  // 1 - sum(weights[0]..weights[i])
  // so rescale r appropriately.
  r -= weights[i];
}

将为您提供所需的分布。

诀窍是 r -=,它确保 r 始终介于 0 和未处理数组元素的总和之间。

你可以在http://jsfiddle.net/KdKdb/测试它

【讨论】:

  • 这个逻辑我不懂,能解释一下吗?
  • 我没有你理解的那么好,但我可以看到它是如何工作的,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2011-11-14
  • 2018-12-14
  • 2021-01-19
相关资源
最近更新 更多