什么是随机的。NET字符串数组的最佳方式?我的数组包含了约500串,我想创建一个新的阵列
具有相同的字符串,但在一个随机顺序。
What is the best way to randomize an array of strings with .NET? My array contains about 500 strings and I'd like to create a new Array
with the same strings but in a random order.
请在你的答案是C#示例。
Please include a C# example in your answer.
如果你在.NET 3.5中,可以使用下面的IEnumerable冷静(VB.NET,而不是C#,但这个想法应该是清楚的... ):
If you're on .NET 3.5, you can use the following IEnumerable coolness (VB.NET, not C#, but the idea should be clear...):
Random rnd=new Random();
string[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();
编辑:好了,这里是对应的VB.NET code:
OK and here's the corresponding VB.NET code:
Dim rnd As New System.Random
Dim MyRandomArray = MyArray.OrderBy(Function() rnd.Next)
二编辑,针对言论System.Random不是线程安全和只适用于玩具的应用由于返回一个基于时间序列:在我的例子中使用,随机()是完全线程安全的,除非你允许在其中随机数组的例程重新输入,在这种情况下,你需要像锁(MyRandomArray)
反正为了不要破坏你的数据,这将保护 RND
为好。
Second edit, in response to remarks that System.Random "isn't threadsafe" and "only suitable for toy apps" due to returning a time-based sequence: as used in my example, Random() is perfectly thread-safe, unless you're allowing the routine in which you randomize the array to be re-entered, in which case you'll need something like lock (MyRandomArray)
anyway in order not to corrupt your data, which will protect rnd
as well.
此外,应该充分理解的是,作为System.Random熵的源不是很强。正如 MSDN文档指出,你应该使用的东西从 System.Security.Cryptography.RandomNumberGenerator 如果你做任何事情与安全相关的。例如:
Also, it should be well-understood that System.Random as a source of entropy isn't very strong. As noted in the MSDN documentation, you should use something derived from System.Security.Cryptography.RandomNumberGenerator
if you're doing anything security-related. For example:
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]);
}