我是Java的初学者,正在做一本书的练习。任务是编写一个静态方法,该方法将字符串数组作为参数,并以随机顺序返回字符串的混乱版本。要创建随机数,您必须使用以下内容:
import java.util.Random;
Random r = new Random();
int rand = r.nextInt();
我的回答如下:
private static String[] jumble(String[] arr){
String [] jumbled = new String[arr.length];
int [] chosen = new int [arr.length];
Random r = new Random();
int rand = r.nextInt(arr.length);
chosen[0] = rand;
jumbled[0] = arr[rand];
for(int i = 1; i < arr.length; i++){
while(checkIfChosen(chosen, rand, i)){
rand = r.nextInt(arr.length);
}
chosen[i] = rand;
jumbled[i] = arr[rand];
}
print(jumbled);
return jumbled;
}
private static void print(String[]arr){
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
private static boolean checkIfChosen(int[] arr, int a, int ind){
for(int i = 0; i < ind; i++){
if(arr[i]==a){
return true;
}
}
return false;
}
这确实有效,但似乎很长时间以来这么简单。任何人都可以改进吗?有没有更简单的方法来实现这样的任务,坚持问题中提到的约束?
编辑:随着费雪耶茨洗牌:public static void main(String[] args) {
String [] original = {"Hello", "How", "Are", "You"};
jumble(original);
}
private static String[] jumble(String[] arr){
Random r = new Random();
for(int i = arr.length-1; i > 0; i--){
int rand = r.nextInt(i);
String temp = arr[i];
arr[i] = arr[rand];
arr[rand] = temp;
}
print(arr);
return arr;
}
private static void print(String[]arr){
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
一段很棒的代码,比我的答案更有效率。感谢。
答案 0 :(得分:4)
您可能只想使用Fisher-Yates shuffle。它只需要一次通过就可以产生“公平”的混乱(假设你的随机数发生器有足够的熵)。
答案 1 :(得分:1)
您的代码对我来说很好。我要做的主要事情是将for循环索引设置为0,内部使用do / while循环,并且在for循环之前不进行随机化和赋值,而是在for循环中执行所有这些操作: / p>
Random r = new Random();
int rand = 0;
for (int i = 0; i < arr.length; i++) {
do {
rand = r.nextInt(arr.length);
} while (checkIfChosen(chosen, rand, i));
chosen[i] = rand;
jumbled[i] = arr[rand];
}
do / while循环保证至少运行一次,而while循环可能会或可能不会运行,具体取决于条件。