Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检测某个数字是否在某个范围内_Java_Random_Probability - Fatal编程技术网

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

Java 检测某个数字是否在某个范围内,java,random,probability,Java,Random,Probability,我有一部分代码生成了一个随机数,然后试图找出这个数字的位置,在0和某个概率之间,以百分比的形式存储在数组中。我知道这听起来可能比实际情况更让人困惑,所以这里是我的代码,基本上是用Java编写的: Random rand = new Random(); double currentProbability = rand.nextDouble(); // these are the "percentages" I refer to above // note that they will not n

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

因此,我的问题主要是,如果概率以百分比形式给出,如何选择随机数所在的索引。也许我把这件事复杂化了,我会要求任何相信这是事实的用户在下面留下评论,而不是否决这个问题

以下是查找索引的代码:

    int index = 0;
    while (true) {
        currentProbability -= probabilities[index];
        if (currentProbability <= 0) {
            break;
        }
        index++;
    }
int索引=0;
while(true){
当前概率-=概率[指数];

如果(currentProbability,以下是查找索引的代码:

    int index = 0;
    while (true) {
        currentProbability -= probabilities[index];
        if (currentProbability <= 0) {
            break;
        }
        index++;
    }
int索引=0;
while(true){
当前概率-=概率[指数];

如果(currentProbability听起来像是要进行加权洗牌。根据集合的大小,可能更容易多次加载包含对象的列表,然后使用java.util.Collection中的静态洗牌(List)方法并从列表顶部弹出一个对象

比如说,, 对于[.49、.49、.02],这将被标准化

对于[.10、.10、.80],这将规范化为[.1、.1、.8],因此,如果这是[A、B、C],则将1a、1b和8c对象加载到列表中,然后使用shuffle


显然,如果列表和大量对象的精度非常高,则此解决方案将不是最佳解决方案。

听起来您想进行加权随机播放。根据集合的大小,可能更容易多次加载包含对象的列表,然后使用静态随机播放(列表)方法,并从列表顶部弹出一个对象

比如说,, 对于[.49、.49、.02],这将被标准化

对于[.10、.10、.80],这将规范化为[.1、.1、.8],因此,如果这是[A、B、C],则将1a、1b和8c对象加载到列表中,然后使用shuffle


显然,如果你的列表有很高的精度,并且有很多对象,那么这个解决方案就不是最优的。

例如,如果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。

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

例如,如果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。

您要查找分布的数字范围是什么?哦,对不起,这非常重要:概率数组中的值将始终总和为100%;但是,此数组中可能只有两个概率,剩余值已设置为
null
你想要找到分布的数字范围是多少?哦,很抱歉,这很重要:概率数组中的值的总和总是100%;但是,在这个数组中可能只有两个概率,剩余的值被设置为
null
,如果你指的是用户1257931的答案,你可以我相信如果是这样的话,我会将他的答案标记为正确(并向上投票)。这与user1257931的答案无关,如果你有很好的精确度,它也会起作用。对于每个桶,你只需要存储一个实数(两个案例之间的边界),以及哪些案例在桶中。是的,我现在看到了区别。那么,向上投票和绿色支票正在进行中。如果您是指用户1257931的答案,您肯定为我提供了一些新的信息。我相信我会将他的答案标记为正确(并向上投票)如果是这样的话。它与user1257931的答案无关,如果你有很好的精度,它也会起作用。对于每个bucket,你只需要存储一个实数(两个案例之间的边界)是的,我现在看到了区别。然后,一个上升的投票和一个绿色的检查在他们的路上。为什么不先对概率进行排序,使它起作用?为什么不先对概率进行排序,使其有效?我不能根据我的情况的性质做出假设,所以我必须考虑一个非常精细的可能性。不幸的是,锡安。尽管如此,这还是值得一提的