Ho un metodo in una classe singleton che deve utilizzare il sistema .NET. Random()
, poiché il metodo viene chiamato in un ambiente multi-thread non posso crearlo solo una volta e dichiararlo staticamente, ma devo creare un oggetto Random()
ogni volta che viene chiamato il metodo. Dal momento che il seme di default Random()
si basa sui segni di spunta dell'orologio, non è abbastanza casuale nel mio senario. Per creare un seme migliore ho esaminato diversi metodi e ho capito che il seguente è il migliore, ma potrebbero esserci altri (più veloci/migliori) modi per farlo che mi piacerebbe sapere.Il modo migliore per seed Random() in singleton
Random rnd = new Random(BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0));
chiarimento Minore: Come RandomNumberGenerator è una classe astratta, si sarebbe effettivamente utilizzare System.Security.Cryptography.RNGCryptoServiceProvider E dovrebbe essere sicuri che se il suo Singleton consente a più utenti simultanei (getInstance non è intrinsecamente sincronizzato), che protegge l'utilizzo dei membri non statici di RNGCryptoServiceProvider, poiché non sono thread-safe. – CPerkins
@CPerkins: buoni punti - grazie! –
@CPerkins: questo è un importante chiarimento, grazie. –