以下代码段shuffle数字并在每次执行中更改数字序列:
Enumerable.Range(1, 1000).OrderBy(r => Guid.NewGuid()).ToList();
但我想要随机数字并在每次执行应用程序时生成相同的数字序列吗?
答案 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)