生成 5 个不相同的随机数,放到一个数组中
- 方案一
public class RandomTest02 {
public static void main(String[] args) {
// 开辟数组空间
int[] arr = new int[5];
// 默认将数组中所有元素初始化为 0
for (int i = 0;i < arr.length; i++){
arr[i] = -1;
}
// 创建 Random 对象
Random r = new Random();
//关键的 index
int index = 0;
w:while(index < arr.length){
// 这里为了显示效果,将边界设置为 6,即数字取值范围为[0,6)
int num = r.nextInt(6);
for (int i = 0; i < index ; i++) {
if(num == arr[i]) {
continue w;
}
}
arr[index] = num;
index++;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
- 方案二
import java.util.Random;
public class RandomTest03 {
public static void main(String[] args) {
int[] arr = new int[5];
for (int i = 0; i < arr.length; i++) {
arr[i] = -1;
}
Random r = new Random();
int index = 0;
while(index < arr.length){
int n = r.nextInt(6);
if(!contains2(arr,n)){ //这里因为判断一个数字是否在一个数组不好写,所以单独写了一个判断的方法
arr[index++] = n;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
//这是我写的判断方法,其实写的复杂了。可以改为下面注释掉的方式
public static boolean contains(int[] a, int num) {
int i;
for (i = 0; i < a.length; i++) {
if (a[i] == num) {
break;
} else {
continue;
}
}
if (i == a.length) {
return false;
} else {
return true;
}
/*for(int j = 0;j < a.length; j++){
if(a[j] == num){
return true;
}
}
return false; */
- 方案三:基于二分法(存在 bug)
这里只贴出了判断的部分代码,主体部分跟上面的方法二一样。这种方式看起来简单完美,但实际运行发现存在 bug:输出的数组中前两个元素永远是 -1,这是因为二分法每次排序都会打乱原数组的顺序导致的 !
因此该方案不可用 !
public static boolean contains2(int[] a, int num){ //这种方案有 bug,但看起来很妙!,
Arrays.sort(a); //这里的排序会导致前两个数永远是 -1
int index = Arrays.binarySearch(a,num);
if (index >= 0){
return true;
}else {
return false;
}
}