Nếu bạn đang sử dụng .NET 3.5, bạn có thể sử dụng tính mát mẻ của IEnountable sau đây (VB.NET, không phải C #, nhưng ý tưởng sẽ rõ ràng ...):
Random rnd=new Random();
string[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();
Chỉnh sửa: OK và đây là mã VB.NET tương ứng:
Dim rnd As New System.Random
Dim MyRandomArray = MyArray.OrderBy(Function() rnd.Next()).ToArray()
Chỉnh sửa thứ hai, để đáp lại nhận xét rằng System.Random "không phải là chủ đề an toàn" và "chỉ phù hợp với các ứng dụng đồ chơi" do trả về chuỗi dựa trên thời gian: như được sử dụng trong ví dụ của tôi, Random () hoàn toàn an toàn cho chủ đề, trừ khi bạn đang cho phép thói quen mà bạn chọn ngẫu nhiên mảng được nhập lại, trong trường hợp đó bạn sẽ cần một cái gì đó giống như lock (MyRandomArray)
dù sao để không làm hỏng dữ liệu của bạn, điều này cũng sẽ bảo vệ rnd
.
Ngoài ra, cần hiểu rõ rằng System.Random là một nguồn entropy không mạnh lắm. Như đã lưu ý trong tài liệu MSDN , bạn nên sử dụng thứ gì đó có nguồn gốc từ System.Security.Cryptography.RandomNumberGenerator
nếu bạn đang làm bất cứ điều gì liên quan đến bảo mật. Ví dụ:
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]);
}