一尘不染

NET随机化数组的最佳方法

c#

用.NET随机化字符串数组的最佳方法是什么?我的数组包含大约500个字符串,我想创建一个Array具有相同字符串但随机顺序的新字符串。

请在答案中包含一个C#示例。


阅读 278

收藏
2020-05-19

共1个答案

一尘不染

如果您使用的是.NET 3.5,则可以使用以下IEnumerable凉爽性(VB.NET,而不是C#,但思路应该很清楚…):

Random rnd=new Random();
string[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();

编辑:确定,这是相应的VB.NET代码:

Dim rnd As New System.Random
Dim MyRandomArray = MyArray.OrderBy(Function() rnd.Next()).ToArray()

第二次编辑,以回应由于返回基于时间的序列而导致System.Random“不是线程安全的”并且“仅适用于玩具应用程序”:如在我的示例中所使用的,Random()完全是线程安全的,除非您允许重新输入随机数组的例程,在这种情况下,无论如何您都需要类似的东西lock (MyRandomArray)以免破坏您的数据,这也将提供保护rnd

同样,应该很好地理解System.Random作为熵的来源不是很强大。如MSDN文档中所述,System.Security.Cryptography.RandomNumberGenerator如果您要进行与安全性相关的任何操作,则应使用从中获取的内容。例如:

using System.Security.Cryptography;

RNGCryptoServiceProvider rnd = new RNGCryptoServiceProvider();
string[] MyRandomArray = MyArray.OrderBy(x => GetNextInt32(rnd)).ToArray();

static int GetNextInt32(RNGCryptoServiceProvider rnd)
    {
        byte[] randomInt = new byte[4];
        rnd.GetBytes(randomInt);
        return Convert.ToInt32(randomInt[0]);
    }
2020-05-19