while (tNumbers.size() < 27) {
int randNum = Helper.random(0, randNumbers.length() - 1);
tNumbers.add(randNumbers.remove(randNum));
}
randNumbers
是从1
到99
的数字数组,这里我填充tNumbers
数组,直到它有27个元素(数字)。因此,如果randNum
多次触发到不存在的密钥,则此代码可能会运行太长时间。
如何使随机更准确?我的意思是让它永远不会错过,并始终在randNumbers
中获得现有的密钥。
答案 0 :(得分:11)
这是一个想法:
Collections.shuffle()
通过执行上述操作,您无需继续生成随机数,直到获得27个元素。这是一个概念证明:
List<Integer> randomNumbers = new ArrayList<Integer>(99);
for (int i = 1; i <= 99; i++)
randomNumbers.add(i);
Collections.shuffle(randomNumbers);
List<Integer> random27 = randomNumbers.subList(0, 27);
答案 1 :(得分:0)
您已经“永远不会错过”,因为您每次都会以相同的概率随机选择其中一个剩余数字。 List.remove()
不会留下空白;在使用该索引调用remove之前,只需get()
随机索引处的元素。
while (tNumbers.size() < 27) {
int randNum = Helper.random(0, randNumbers.length() - 1);
//both extremes inclusive!
tNumbers.add(randNumbers.get(randNum));
randNumbers.remove(randNum);
}
您的Helper.random()
函数的分布可能会或可能不准确;你是怎么实现的?
答案 2 :(得分:0)
随机并不意味着唯一,它意味着随机,这意味着它可以随机随机创建相同数量N
次。如果你想要唯一的数字,不要使用任何随机的数字,使用一些独特的东西,就像一个完美的哈希函数,保证没有重复。