一致地打乱字符串列表

Mig*_*ura 2 c#

使用 C# 6 我有一个按字母顺序排列的名称列表:

List<String> names = getAlphabeticallyOrderedNames();
Run Code Online (Sandbox Code Playgroud)

我需要重新排列名称,但我想每次都得到相同的结果。所以我不能使用:

List<String> shuffledNames = names.OrderBy(x => Guid.NewGuid());
Run Code Online (Sandbox Code Playgroud)

然后我尝试了类似的事情:

List<String> shuffledNames = names.OrderBy(x => "d2fda3b5-4089-43f9-ba02-f68d138dee49");
Run Code Online (Sandbox Code Playgroud)

或者

List<String> shuffledNames = names.OrderBy(x => Int32.MaxValue);
Run Code Online (Sandbox Code Playgroud)

但名字并没有被打乱......

我该如何解决这个问题?

Mat*_*son 5

您可以使用标准的随机播放算法,例如此答案中的算法

适当修改以添加种子参数,它看起来像这样:

public static void Shuffle<T>(IList<T> list, int seed)
{
    var rng = new Random(seed);
    int n = list.Count;

    while (n > 1)
    {
        n--;
        int k = rng.Next(n + 1);
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后以可重复的方式进行洗牌,只需为每个重复的洗牌指定相同的种子:

List<String> names = getAlphabeticallyOrderedNames();
int seed = 12345;
Shuffle(names, seed);
Run Code Online (Sandbox Code Playgroud)