有没有办法以一种没有字符串在其原始位置的方式来改变字符串数组?轮换不是一个选项
答案 0 :(得分:4)
您可以实现Fisher-Yates Shuffle,但在每次迭代时,从随机范围中排除当前位置。这实际上是a common mistake,会降低随机播放的质量。
编辑:继续阅读,我发现这实际上有一个名字:Sattolo's Algorithm。
答案 1 :(得分:0)
这只是一种方法。我确信有更快或更有效的方法,但这很好用。
static Random r;
public static String[] shuffle(String[] input)
{
if(r == null) r = new Random();
String[] output = new String[input.length];
ArrayList<Integer> indices = new ArrayList<Integer>();
for(int i = 0; i < input.length; i++) indices.add(i);
for(int i = 0; i < output.length; i++)
{
int randomIndicesIndex = r.nextInt(indices.size());
int randomIndex = indices.get(randomIndicesIndex);
indices.remove(randomIndicesIndex);
output[i] = input[randomIndex];
}
return output;
}
在循环中调用时,它会输出以下结果:
01: Hilda, Quinn, Lyon, Danny, Rob, Clyde, Joe, Jeff, Samantha
02: Hilda, Samantha, Clyde, Danny, Lyon, Joe, Quinn, Rob, Jeff
03: Rob, Samantha, Hilda, Joe, Danny, Jeff, Lyon, Clyde, Quinn
04: Jeff, Lyon, Joe, Quinn, Clyde, Hilda, Rob, Danny, Samantha
05: Danny, Jeff, Hilda, Lyon, Joe, Samantha, Rob, Clyde, Quinn
06: Lyon, Danny, Jeff, Quinn, Rob, Hilda, Clyde, Samantha, Joe
07: Clyde, Hilda, Rob, Samantha, Lyon, Quinn, Danny, Jeff, Joe
08: Clyde, Jeff, Samantha, Danny, Quinn, Hilda, Joe, Lyon, Rob
09: Jeff, Samantha, Danny, Clyde, Rob, Joe, Quinn, Lyon, Hilda
10: Clyde, Samantha, Danny, Lyon, Rob, Hilda, Quinn, Jeff, Joe