在单例中播种Random()的最佳方法我在单例类中有一个方法需要使用.NET系统。Random(),因为在多线程环境下调用该方法,我不能只创建一次并静态声明它,而是每次调用该方法时都必须创建一个Random()对象。由于Random()默认种子基于时钟滴答,因此在我的senario中它不够随机。为了创造更好的种子,我研究了几种方法并认为以下方法是最好的,但可能还有其他(更快/更好)的方法来做我想知道的事情。随机rnd=newRandom(BitConverter.ToInt32(Guid.NewGuid().ToByteArray(),0));与其尝试自己想出更好的种子,不如使用System.Security.Cryptography.RandomNumberGenerator。它使用基于涉及许多不同环境变量的复杂算法的种子。系统时间是其中之一,因为IIRC它是您的网卡的MAC地址等。它也被认为是一种比Random类实现的算法更“随机”的算法。这是我的实现。线程安全,无锁。publicstaticclassStrongRandom{[ThreadStatic]privatestaticRandom_random;publicstaticintNext(intinclusiveLowerBound,intinclusiveUpperBound){if(_random==null){varcryptoResult=newbyte[4];新的RNGCryptoServiceProvider().GetBytesResult(加密);intseed=BitConverter.ToInt32(cryptoResult,0);_random=新随机(种子);}//Random.Next的上限是独占的intexclusiveUpperBound=inclusiveUpperBound+1;返回_random.Next(inclusiveLowerBound,exclusiveUpperBound);}}静态创建它并使用锁使其线程安全:publicstaticclassRandomProvider{privatestaticRandom_rnd=newRandom();私有静态对象_sync=newobject();publicstaticintNext(){lock(_sync){return_rnd.Next();}}publicstaticintNext(intmax){lock(_sync){return_rnd.Next(max);}}publicstaticintNext(intmin,intmax){lock(_sync){return_rnd.Next(min,max);如果出于某种原因你仍然需要在每个线程中使用Random对象,你可以使用静态类来为它们播种:Randomr=newRandom(RandomProvider.Next()^Environment.TickCount);一个使用RNGCryptoServiceProvider生成随机数的示例程序以上是C#学习教程:单例中播种Random()的最佳方式所有内容分享,如果对大家有用又需要详细了解C#学习教程,我希望大家多多关注——classProgram{publicstaticvoidMain(string[]args){inti;字节b随机;字符串sL;for(i=0;i本文收集自网络,不代表立场,如涉及侵权,请点击维权联系管理员删除,如需转载请注明出处:
