1

所以,我有一个随机数生成器,它生成 10 个介于 1 和用户输入的最大值之间的数字。它运作良好,但我想让它不会产生重复的数字。因此,如果它生成 5,则其他数字都不能是 5。

4

5 回答 5

3

您可以尝试拒绝抽样。从一个空集开始。生成一个数字,如果它在集合中,再试一次。也就是说,继续挑选,直到找到不在集合中的数字。找到新号码后,将其添加到集合中,然后将其返回给用户。

当然,如果已经生成了大量的数字,比如 k 并且上限为 n,那么获得一个新数字的时间遵循几何分布(成功概率为 (nk)/n),因此期望的采样数在您找到唯一编号之前需要的是 n/(nk)。

于 2013-04-28T06:21:54.653 回答
3

如果你有一个小的最大值,你可以使用 Collection.shuffle() 一个唯一值的列表。您可以从中选择 10 个元素。

于 2013-04-28T06:34:00.677 回答
0

你不是第一个问这个问题的人。有关一般答案,请参阅https://crypto.stackexchange.com/questions/1379/how-to-generate-a-list-of-unique-random-strings

于 2013-04-28T12:16:47.737 回答
0

为了确保数字不重复,将找到的数字存储在 Java SET 中,以便仅在其中没有重复的情况下添加。

随机生成算法可以是这样的:

take the system time as your seed value 
use this to get the random numbers
suppose user says number between 1-100
so take system milliseconds%100 so time always  changes so maximum probability that you get random numbers.

因此,在这种情况下,始终将种子值 mod(%) 设为上限,即 100。

于 2013-04-28T13:32:00.273 回答
0
int i = 0, r = 0;
    boolean ch = true;
    int[] list = new int[num];
    while (i < num)
    {
        r = rnd.nextInt(num);
        ch = true;
        for (int j = 0; j < i; j++)
            if (r == list[j])
            {
                ch = false;
                break;
            }
        if (ch)
        {
            list[i] = r;
            i++;
        }
    }
于 2015-09-14T10:12:17.233 回答