随机数在不同进程中相同[重复]

问题描述 投票:0回答:1

此问题已经在这里有了答案:

我正在使用以下代码来生成用于记录的唯一应用程序实例ID。

public MainWindow()
{
    InitializeComponent();

    Random rnd = new Random();

    instanceID = rnd.Next(100000, 999999);

    /// ...
}

我的应用程序以不同的服务(使用nssm)作为服务器启动时,服务器启动了2次以上,并且具有不同的参数。我的问题:如果它们在同一时间(同一秒)启动,则instanzID相同,如果1或更多秒的差异instanzID不同。我如何避免这种情况?

c# random
1个回答
1
投票

嗯,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);

0
投票

默认情况下,Random对象使用当前时间作为初始种子。只需在构造函数中提供一个int作为Random rnd = new Random(seed),其中seed是算法的初始种子。只要所有seed对象的Random都相同,它们就会产生相同的随机数序列。

© www.soinside.com 2019 - 2024. All rights reserved.