在我的Android应用中,我需要从指定范围中选择两个随机整数。下面的代码可以工作,但它并不是真正选择一个随机整数,它正在改变整数。而让我烦恼的是,由于代码中的randomNum2= (int)it.next();
位,我必须将max int指定为小于实际最大值的一个。如果我将正确的数字(当前为127)作为最大值,那么我得到错误java.util.NoSuchElementException
,因为它正在寻找128作为下一次迭代。在我使用rand = new Random();
randomNum1 = rand.nextInt(max - min + 1) + min;
randomNum2 = rand.nextInt(max - min + 1) + min;
之前,问题是两个随机的整数可能最终是相同的,我需要它们是唯一的。那么有谁能建议一个更好的方法从最小/最大整数范围获得两个随机数?这是我的代码:
int min = 1;
int max = 126;
int randomNum1;
int randomNum2;
List<Integer> choicesL;
public void randomTwo() {
choicesL = new LinkedList<Integer>();
for (int i = min; i <= max; i++) {
choicesL.add(i);
}
Collections.shuffle(choicesL);
Iterator<Integer> it = choicesL.iterator();
while (it.hasNext())
{
randomNum1= (int)it.next();
randomNum2= (int)it.next();
}
}
答案 0 :(得分:1)
您可以使用旧代码,但可以使用循环播放。
rand = new Random();
randomNum1 = rand.nextInt(max - min + 1) + min;
randomNum2 = rand.nextInt(max - min + 1) + min;
while (randomNum2==randomNum1){
randomNum2 = rand.nextInt(max - min + 1) + min;
}
修改强>
有很多方法可以查找随机数。我不知道你是否知道这一点,但在这之下有很多统计研究。如果你需要一种快速计算随机数的方法,这很好。但是你必须知道,在很长一段时间后,用户可以知道随机数的分布情况。如果您想改进代码,可以查看:
http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform
http://en.wikipedia.org/wiki/Ziggurat_algorithm
当然,我认为网上还有更多的理论
答案 1 :(得分:0)
您可以使用Set
并继续插入元素,直到该集合的大小为2。
对于少量元素(与范围的大小相比),这应该比填充和混洗列表更有效。
int max = 126;
int min = 1;
int size = 2;
Set<Integer> set = new HashSet<Integer>();
Random r = new Random();
while (set.size() != size) {
set.add(r.nextInt(max - min + 1) + min);
}
System.out.println(set);
注意:这是一个通用答案,适用于所有需要的尺寸(当然假设为size <= max - min
)