Si está en .NET 3.5, puede usar la siguiente frescura IEnumerable (VB.NET, no C #, pero la idea debería ser clara ...):
Random rnd=new Random();
string[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();
Editar: OK y aquí está el código VB.NET correspondiente:
Dim rnd As New System.Random
Dim MyRandomArray = MyArray.OrderBy(Function() rnd.Next()).ToArray()
Segunda edición, en respuesta a los comentarios de que System.Random "no es seguro para subprocesos" y "solo es adecuado para aplicaciones de juguete" debido a que devuelve una secuencia basada en el tiempo: como se usa en mi ejemplo, Random () es perfectamente seguro para subprocesos, a menos que está permitiendo que se vuelva a ingresar la rutina en la que aleatoriza la matriz, en cuyo caso necesitará algo así lock (MyRandomArray)
para no corromper sus datos, lo que protegerárnd
.
Además, debe entenderse bien que System.Random como fuente de entropía no es muy fuerte. Como se señala en la documentación de MSDN , debe usar algo derivado System.Security.Cryptography.RandomNumberGenerator
si está haciendo algo relacionado con la seguridad. Por ejemplo:
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]);
}