我找到了一种在互联网上洗牌的方法.
Random rand = new Random();
shuffledArray = myArray.OrderBy(x => rand.Next()).ToArray();
Run Code Online (Sandbox Code Playgroud)
但是,我有点担心这种方法的正确性.如果OrderBy x => rand.Next()
对同一个项执行多次,结果可能会发生冲突并导致奇怪的事情(可能是异常).
我尝试过,一切都很好,但我仍然想知道这是否绝对安全,并且始终按预期工作,我无法通过Google找到答案.
谁能给我一些解释?
提前致谢.
你的方法应该有效,但速度很慢。
它之所以有效,是因为OrderBy
首先使用键选择器计算每个项目的键,然后对键进行排序。因此,每个项目仅调用一次键选择器。
ComputeKeys
在 .NET Reflector 中查看类中的方法EnumerableSorter
。
this.keys = new TKey[count];
for (int i = 0; i < count; i++)
{
this.keys[i] = this.keySelector(elements[i]);
}
// etc...
Run Code Online (Sandbox Code Playgroud)
这是否绝对安全并且始终按预期工作
它没有记录,所以理论上它将来可能会改变。
对于随机洗牌,您可以使用Fisher-Yates shuffle。这也更高效 - 仅使用 O(n) 时间并就地洗牌,而不是 O(n log(n)) 时间和 O(n) 额外内存。
相关问题
归档时间: |
|
查看次数: |
407 次 |
最近记录: |