生成一组均匀分布的随机数

3
我有一个包含N个对象的列表。
我想要插入X个虚拟对象,这些对象随机放置在实际N个对象之间,间隔在(0,N)之间。

因此,我尝试了以下代码。

int[] dummyIndexes = new int[X];
int randomStep = N/X * 2; // *2 because the Mean is N/X/2

Random random = new Random();
int randIdx = 0;

for (int i=0; i < X; i++)
{ 
   randIdx += random.nextInt(randomStep);
   dummyIndexes[i] = randIdx;
}

这个方法可以正常工作,但是我没有得到一个好的分布,一直到域N的结尾。

有更好的方法吗?


在我看来,如果 randomStep 不等于 N,那么生成的随机数将无法均匀分布到 N - Hot Licks
我认为你应该执行 random.nextInt(randomStep)+1,否则如果结果是零,你将得到两个或更多的虚拟索引实际上是相同的。 - Yoni
当然,需要注意的是,如果你想要可能得到一个值为N的输出,那么你需要在nextInt中指定N+1 - Hot Licks
2个回答

1

这将确保您在每个N/X之间有一个随机值

 randIdx = N * i / X + random.nextInt(N / X) + 1;

0

这样做就可以了(但请注意,它永远不会在N处放置任何东西,最大值将是N-1)

    int[] dummyIndexes = new int[X];
    int randomStep = N/X;
    Random random = new Random();
    int randIdx = 0;
    for (int i=0; i < X; i++)
    { 
       randIdx = randomStep * i  + random.nextInt(randomStep);
       dummyIndexes[i] = randIdx;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接