用.NET随机化字符串数组的最佳方法是什么?我的数组包含大约500个字符串,我想创建一个Array具有相同字符串但随机顺序的新字符串。
Array
请在答案中包含一个C#示例。
如果您使用的是.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。
lock (MyRandomArray)
rnd
同样,应该很好地理解System.Random作为熵的来源不是很强大。如MSDN文档中所述,System.Security.Cryptography.RandomNumberGenerator如果您要进行与安全性相关的任何操作,则应使用从中获取的内容。例如:
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]); }