Se você usa o .NET 3.5, pode usar o seguinte frescor IEnumerable (VB.NET, não C #, mas a ideia deve ficar clara ...):
Random rnd=new Random();
string[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();
Edit: OK e aqui está o código VB.NET correspondente:
Dim rnd As New System.Random
Dim MyRandomArray = MyArray.OrderBy(Function() rnd.Next()).ToArray()
Segunda edição, em resposta às observações de que System.Random "não é seguro para threads" e "adequado apenas para aplicativos de brinquedo" devido ao retorno de uma sequência baseada em tempo: conforme usado no meu exemplo, Random () é perfeitamente seguro para threads, a menos que você está permitindo que a rotina na qual você aleatoriamente a matriz seja reinserida; nesse caso, você precisará de algo semelhante lock (MyRandomArray)
para não corromper seus dados, o que protegerárnd
.
Além disso, deve-se entender que o System.Random como fonte de entropia não é muito forte. Conforme observado na documentação do MSDN , você deve usar algo derivado System.Security.Cryptography.RandomNumberGenerator
se estiver fazendo algo relacionado à segurança. Por exemplo:
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]);
}