所以,我有一个随机数生成器,它生成 10 个介于 1 和用户输入的最大值之间的数字。它运作良好,但我想让它不会产生重复的数字。因此,如果它生成 5,则其他数字都不能是 5。
问问题
608 次
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 回答