Java 如何使一个数字不产生两次?
在我的程序中,我使用一个随机生成器Java 如何使一个数字不产生两次?,java,android,Java,Android,在我的程序中,我使用一个随机生成器 Random random = new Random(); //How i use it int i = random.nextInt(numberNeeded); 问题是,我需要找到一种方法,每个数字只生成一次。所以我猜它不是完全随机的…例如…当数字1生成时,我不希望它再次被调用,而是调用其他数字中的一个…例如2,3或4…然后当调用4时,它只能调用2或3 然后下一次数字被洗牌,然后它重复这个过程 首先,请确保在应用程序首次启动时只执行一次new Rand
Random random = new Random();
//How i use it
int i = random.nextInt(numberNeeded);
问题是,我需要找到一种方法,每个数字只生成一次。所以我猜它不是完全随机的…例如…当数字1生成时,我不希望它再次被调用,而是调用其他数字中的一个…例如2,3或4…然后当调用4时,它只能调用2或3
然后下一次数字被洗牌,然后它重复这个过程
首先,请确保在应用程序首次启动时只执行一次
new Random()
其次,记住变量中的最后一个值,并永远循环,直到它不匹配为止
Random random = new Random();
int lastNumber = -1;
while (true)
{
int i = random.nextInt(numberNeeded);
if (i == lastNumber) continue;
lastNumber = i;
break;
}
在要从中选择的元素列表上使用它可能会容易得多:
ArrayList<Integer> numbers = new ArrayList<Integer>();
for (int i=4; i<=16; i++)
numbers.add(i);
Collections.shuffle(numbers);
// numbers is now in a random order and contain the numbers 4 through 16
ArrayList number=new ArrayList();
对于(int i=4;i将数字4到16添加到ArrayList,然后将其与集合一起洗牌。洗牌(…)。然后按ArrayList顺序返回它们。您可以使用集合。洗牌
//Setup your list as needed...
final List<Integer> list = new ArrayList<Integer>();
list.addAll(Arrays.asList(new Integer[] {
1, 2, 3, 4 }));
// Randomizes the list
Collections.shuffle(list);
for (Iterator<Integer> i = list.iterator(); i.hasNext();) {
System.out.println(i.next());
//Removes from the list...
i.remove();
}
//根据需要设置您的列表。。。
最终列表=新的ArrayList();
list.addAll(Arrays.asList)(新整数[]){
1, 2, 3, 4 }));
//将列表随机化
集合。洗牌(列表);
for(迭代器i=list.Iterator();i.hasNext();){
System.out.println(i.next());
//从列表中删除。。。
i、 删除();
}
也许不是最好的方法,但最直接的方法是使用布尔数组
//create an array of boolean values set to TRUE
boolean[] isavailable = new boolean[somesize];
Arrays.fill(isavailable, Boolean.TRUE);
//Get a random number
Random r = new Random();
int myrandomnumber=r.nextInt()%25; //Im just going to use 25 for example
if (isavailable[myrandomnumber])
{
isavailable[myrandomnumber]=false;
//do whatever you want with the number here
}
else
{
//Generate another random number here
}
老实说,最好将其放入一个while循环,这样,如果您在一行中生成两个以上的不可用数字,您就可以得到覆盖,但这应该给出基本思路。那么我如何从中生成随机数?例如int=random.nextInt()@生命编码器22-第一个随机数将是数字。get(0)
,第二个数字。get(1)
,等等。如果第一次迭代的i=4,则在第一次迭代时失败。如果(i==lastNumber)返回false作为i=4,lastNumber=-1,则循环中断