//生成10个随机数(有重复)【1-10】
@Test
public void test1() {
Random r = new Random();
for (int i = 0; i < 10; i++) {
System.out.println(r.nextInt(11));//表示范围【0-10】
}
}
//生成10个随机不可重复数【0-101)
方法一:
分析:
要使数字不重复,会想到set集合存储数据的特点就是无序不可重复,所以可讲随机生成的数字放入set集合中,随后遍历集合即可。代码如下:
@Test
public void test() {
Set set = new HashSet();
while (true) {
set.add(new Random().nextInt(101));
if (set.size() == 10) {
break;
}
}
//遍历数组元素
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
但是当我使用以上方法遍历范围为【0-9】的数字时,输出了这样的结果:
多次执行后仍是一样的结果(给人一种好似有序的假象),至于什么原因,这和hashSet存储数据的原理有关。
所以还需将已输出的结果(即set集合中的元素)打乱顺序,想到Collections工具类有个shuffle();方法可以将list集合中的元素打乱,所以将set集合中的元素转换为list集合中的元素即可。代码如下:
@Test
public void test() {
Set set = new HashSet();
while (true) {
set.add(new Random().nextInt(10));
if (set.size() == 10) {
break;
}
}
//set集合转换位list集合
ArrayList list = new ArrayList(set);
//打乱list集合元素
Collections.shuffle(list);
// 遍历数组元素
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
方法2:
创建了一个长度为9的Boolean数组用于存放产生的数字是否已经出现过,如果出现过,while循环会一直继续下去直到产生一个从未出现过的数字。代码如下:
@Test
public void test2() {
Random random = new Random();
boolean[] bool = new boolean[9];
int randInt = 0;
for (int j = 0; j < 9; j++) {
do {
randInt = random.nextInt(9);
} while (bool[randInt]);
bool[randInt] = true;
System.out.println(randInt);
}
}