如何确保只生成一次随机数?
例如:
for(int i = 0; i<len; i++)
{
while (rands.contains(rand = r.nextInt(len-2)+1));
rands.add(rand);
System.out.print ("Rand ___ " + rand + "___");
}
如何确保如果从rand生成数字2,它将不再生成?
如果我不清楚自己,我道歉。如果您需要更多信息,请发表评论。
感谢。
答案 0 :(得分:1)
使用随机API时,您无法真正限制它。您可能需要保留已生成数字的列表,如果尚未生成数字,则返回该数字。
答案 1 :(得分:1)
您必须存储您生成的所有数字,然后检查新数字。出于性能原因使用HashSet
:
HashSet<Integer> rands = new HashSet<Integer>();
for(int i = 0; i<3; i++)
{
int rand;
while (rands.contains(rand = r.nextInt(3)))
;
rands.add(rand);
}
答案 2 :(得分:0)
我假设你想以随机顺序创建一个0-2的数字列表(如果我错了,请告诉我)
您真正想要的是创建这些数字的列表
ArrayList<Integer> randomNums = ArrayList<Integer>() {{ add(0); add(1); add(2); }}
然后使用Collections
来改变它。
Collections.shuffle(randomNums)
答案 3 :(得分:0)
你需要使用一个改组算法。从1开始。创建一个从1到1000(任意大小)的整数数组。将阵列洗得很好。继续从洗牌阵列中取出,直到你用完它们为止。当您通过1000时,使用1000-2000,shuffle和use重新填充数组。根据需要多次重复此过程。
答案 4 :(得分:0)
如果您只需要某个范围内的非重复随机数流,您可以执行以下操作:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class RandomNumberStream {
private Iterator<Integer> numbers;
public RandomNumberStream(int range) {
List<Integer> numbersList = new ArrayList<>(range);
for(int i = 0; i < range; i++) {
numbersList.add(i);
}
Collections.shuffle(numbersList);
numbers = numbersList.iterator();
}
public int nextNumber() {
if(!numbers.hasNext()) {
throw new IllegalStateException("No more numbers..."); //you might want to handle this differently
}
return numbers.next();
}
public static void main(String[] args) {
RandomNumberStream rand = new RandomNumberStream(5);
for(int i = 0; i < 5; i++) {
System.out.println(rand.nextNumber());
}
}
}