检测数字是否在某个范围内

时间:2014-02-01 05:24:13

标签: java random probability

我有一部分代码生成一个随机数,然后尝试找出数字落在哪里,在零和一些概率之间,以百分比形式存储在数组中。我知道这可能听起来比实际上更令人困惑,所以这里是我的代码,基本上是在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

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

3 个答案:

答案 0 :(得分:2)

以下是查找索引的代码:

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

答案 1 :(得分:1)

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

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

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

显然,如果你的List和很多对象都有非常精确的精度,那么这个解决方案就不是最优的。

答案 2 :(得分:1)

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。