Tengo un método en una clase singleton que necesita usar el sistema .NET. Random()
, dado que se llama al método en un entorno de subprocesos múltiples, no puedo crearlo solo una vez y declararlo estáticamente, pero tengo que crear un objeto Random()
cada vez que se llama al método. Dado que Random()
inicialización predeterminada se basa en las marcas de reloj, no es lo suficientemente aleatorio en mi senario. Para crear una mejor semilla, he examinado varios métodos y he pensado que el siguiente es el mejor, pero puede que haya otras formas (más rápidas/mejores) de hacerlo que me gustaría saber.La mejor manera de inicializar Random() en singleton
Random rnd = new Random(BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0));
aclaración Menor: Como RandomNumberGenerator es una clase abstracta, él realmente utilizan System.Security.Cryptography.RNGCryptoServiceProvider Y él debe estar seguro de que si su producto único permite que varios usuarios simultáneos (getInstance no está sincronizado inherentemente), que protege el uso de los miembros no estáticos de RNGCryptoServiceProvider, ya que no son seguros para subprocesos. – CPerkins
@CPerkins: Buenos puntos, ¡gracias! –
@CPerkins: Esa es una gran aclaración, gracias. –