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

时间:2017-06-12 18:27:09

标签: c# .net .net-core

以下代码段shuffle数字并在每次执行中更改数字序列:

Enumerable.Range(1, 1000).OrderBy(r => Guid.NewGuid()).ToList();

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

2 个答案:

答案 0 :(得分:5)

使用Fisher-Yates shuffle之类的算法对项目进行重新排序会更有效。 OrderBy的运行时复杂度为O(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;
    }
}

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

var shuffledList = Enumerable.Range(0, 1000).ToList().Shuffle(new Random(0));

答案 1 :(得分:3)

不应使用O(n log n)排序进行混洗(更不用说生成Guid值的开销),而应使用Random和标准O(n){{3 } - Fisher Yates。然后,您可以在每次执行时为Random对象提供相同的种子。