【问题标题】:Detecting if a Number is within a Certain Range检测数字是否在特定范围内
【发布时间】:2014-02-01 05:24:13
【问题描述】:

我有一部分代码生成一个随机数,然后尝试找出数字落在哪里,介于零和某个概率之间,以百分比形式存储在数组中。我知道这听起来可能比实际上更令人困惑,所以这里是我的代码,基本上是用 Java 编写的:

Random rand = new Random();
double currentProbability = rand.nextDouble();

// these are the "percentages" I refer to above
// note that they will not necessarily be in least-to-greatest/greatest-to-least 
// order
double[] probabilities = new double[]{0.49, 0.49, 0.02};
// the objects in the array below correspond to the probabilities at the same 
// index in the "probabilities" array above
Object[] correspondingObjects = new Object[]{new Object(), new Object(), new Object()};

// here, I would find between which percentage the random number lies, and choose
// the corresponding object from the array of Objects

因此,我的问题主要是如何选择随机数所在的索引,如果概率以百分比形式给出。也许我过于复杂了,我会要求任何认为是这种情况的用户在下面留下评论,而不是对这个问题投反对票。

【问题讨论】:

  • 你想找到分布的数字范围是多少?
  • 哦,对不起,这很重要:概率数组中的值总和为 100%;但是,此数组中可能只有两个概率,其余值已设置为 null

标签: java random probability


【解决方案1】:

这是查找索引的代码:

    int index = 0;
    while (true) {
        currentProbability -= probabilities[index];
        if (currentProbability <= 0) {
            break;
        }
        index++;
    }

【讨论】:

  • 为什么不先对概率进行排序,让它发挥作用?
【解决方案2】:

D.E. Knuth 描述了一种方法,如果可供选择的案例数量很大,该方法很有用。如果必须在 n 个案例中进行选择,则将它们分配到 n-1 个大小相等的桶中,这样每个桶中的案例不超过 2 个。可以证明,这总是可能的。选择一个案例是一个可以在恒定时间内执行的两步过程:首先选择一个桶,然后决定该桶中的两个案例中的哪一个适用。

例如,如果 A、B、C 的分布是 [0.49, 0.49, 0.02],我们会得出两个大小为 0.5 的桶。第一个包含 0.02 C 和 0.48 A;第二个 0.01 A 和 0.49 B。总之,你得到了原始概率。

如果生成的随机数 r 小于 0.5 我们选择第一个桶,如果 r 小于 0.02 则选择案例 C,否则选择 A。如果 r 大于 0.5,则选择第二个桶,如果 (r-0.5)低于 0.01 我们选择案例 A,否则选择案例 B。

【讨论】:

  • 如果您指的是 user1257931 的回答,那么您肯定对我有所了解。如果是这种情况,我相信我会将他的答案标记为正确(并为你的答案投票)。
  • 这与 user1257931 的答案无关,如果你有非常好的精度,它也可以工作。对于每个存储桶,您只需存储一个实数(两个案例之间的边界),以及哪些案例在存储桶中。
  • 是的,我现在看到了区别。那么,赞成票和绿色支票即将到来。
【解决方案3】:

听起来你想做一个加权洗牌。根据您的集合的大小,多次加载带有对象的列表可能更容易,然后使用 java.util.Collection 中的静态 shuffle(List) 方法并从列表顶部弹出一个对象。

例如, 对于 [.49,.49,.02],这将被标准化。

对于 [.10, .10, .80] 这将归一化为 [.1, .1, .8] 所以如果这是 [A, B, C] 你将加载 1 A, 1 B 和 8 C将对象放入列表中,然后使用随机播放。

显然,如果您的 List 具有非常精细的精度和大量对象,那么此解决方案将不是最佳解决方案。

【讨论】:

  • 由于我的情况,我无法做出假设,所以很遗憾,我必须考虑非常精确的可能性。尽管如此,这值得一票
猜你喜欢
  • 2021-04-01
  • 1970-01-01
  • 2015-11-28
  • 2014-12-05
  • 2011-06-02
  • 1970-01-01
  • 2017-05-16
  • 2014-05-05
  • 2021-03-15
相关资源
最近更新 更多