首页 > 解决方案 > 不同过程中随机数相同

问题描述

我正在使用以下代码生成唯一的应用程序实例 ID 以进行日志记录。

public MainWindow()
{
    InitializeComponent();

    Random rnd = new Random();

    instanceID = rnd.Next(100000, 999999);

    /// ...
}

我的应用程序从 windowsserver 开始,作为不同的服务(使用 nssm)2 次或更多次具有不同的参数。我的问题:如果它们同时开始(同一秒),则 instanzID 相同,如果 1 秒或更多秒差异 instanzID 不同。我怎样才能避免这种情况?

标签: c#random

解决方案


好吧,Random不是线程安全的( 提到了“服务器作为不同的服务”),这就是为什么让每个线程都有自己的实例:Random

private static ThreadLocal<Random> MyRandom = ...

由于我们不希望所有这些实例生成相同的序列,让我们提供一个熵源,我们可以借助以下方法来做到这一点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);

推荐阅读