此问题已经在这里有了答案:
我正在使用以下代码来生成用于记录的唯一应用程序实例ID。
public MainWindow()
{
InitializeComponent();
Random rnd = new Random();
instanceID = rnd.Next(100000, 999999);
/// ...
}
我的应用程序以不同的服务(使用nssm)作为服务器启动时,服务器启动了2次以上,并且具有不同的参数。我的问题:如果它们在同一时间(同一秒)启动,则instanzID相同,如果1或更多秒的差异instanzID不同。我如何避免这种情况?
嗯,Random
是不是 线程安全,这就是为什么让每个线程都有自己的Random
实例:
private static ThreadLocal<Random> MyRandom = ...
由于我们不希望所有这些缺陷都生成相同的序列,因此我们提供一个entropy source,例如借助RNGCryptoServiceProvider
using System.Security.Cryptography;
using System.Threading;
...
private static ThreadLocal<Random> MyRandom = new ThreadLocal<Random>(() => {
int seed;
using (RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider()) {
byte[] seedData = new byte[sizeof(int)];
provider.GetBytes(seedData);
seed = BitConverter.ToInt32(seedData, 0);
}
return new Random(seed);
});
现在,MyRandom
是线程安全的,每个线程都有其自己的(伪)随机序列。
instanzID = MyRandom.Next(100000, 999999);
默认情况下,Random
对象使用当前时间作为初始种子。只需在构造函数中提供一个int
作为Random rnd = new Random(seed)
,其中seed
是算法的初始种子。只要所有seed
对象的Random
都相同,它们就会产生相同的随机数序列。