改变字符串使得没有对象在其原始位置

时间:2014-02-06 21:31:02

标签: java shuffle

有没有办法以一种没有字符串在其原始位置的方式来改变字符串数组?轮换不是一个选项

2 个答案:

答案 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