在每次执行中随机数和生成相同的数字序列

use*_*508 0 .net c# .net-core

下面的片段随机数和每次执行中更改数字序列:

Enumerable.Range(1, 1000).OrderBy(r => Guid.NewGuid()).ToList();
Run Code Online (Sandbox Code Playgroud)

但是我想要随机数字并在每次执行应用程序时生成相同的数字序列?

Mar*_*age 5

使用Fisher-Yates shuffle等算法对项目进行重新排序会更有效.运行时的复杂性OrderByO(N log N)在Fisher-Yates shuffle的同时O(N).

此外,要提供随机数,您应该使用Random该类,而不是Guid.NewGuid用于完全不同的目的,而恰好创建一些随机的(以更高的成本).

我更喜欢将shuffle实现为扩展方法:

public static class ListExtensions
{
    public static IList<T> Shuffle<T>(this IList<T> list, Random random)
    {
        for (var i = list.Count; i > 1; i -= 1)
        {
            var j = random.Next(i); 
            var temp = list[j];
            list[j] = list[i - 1];
            list[i - 1] = temp;
        }
        return list;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过提供Random具有特定种子的实例(在本例中为0)来实现所需的结果.这将确保每次代码执行时生成的随机数序列相同:

var shuffledList = Enumerable.Range(0, 1000).ToList().Shuffle(new Random(0));
Run Code Online (Sandbox Code Playgroud)