C# 获取设置参数之间的数字的线程安全数字生成器方法?

C# 获取设置参数之间的数字的线程安全数字生成器方法?,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我需要在100个不同的线程中同时运行以下方法,但我似乎无法完成,因为当我仅尝试使用两个线程时,它会为这两个线程生成相同的随机数。有没有线程安全的方法,我可以得到一个随机数之间的两组数字?我记得我可以在Java中使用ThreadLocalRandom.current().nextInt()来实现这一点,但我似乎在c#中找不到等价物 很抱歉我写得不好,英语不是我的第一语言。问题不是多线程,而是使用默认构造函数:new Random() 如果您连续四次调用您的方法,那么所有这些随机实例都很有可能获得相

我需要在100个不同的线程中同时运行以下方法,但我似乎无法完成,因为当我仅尝试使用两个线程时,它会为这两个线程生成相同的随机数。有没有线程安全的方法,我可以得到一个随机数之间的两组数字?我记得我可以在Java中使用
ThreadLocalRandom.current().nextInt()
来实现这一点,但我似乎在c#中找不到等价物


很抱歉我写得不好,英语不是我的第一语言。

问题不是多线程,而是使用默认构造函数:
new Random()

如果您连续四次调用您的方法,那么所有这些
随机
实例都很有可能获得相同的种子,从而生成相同的数字序列。你需要从外部获得一粒种子,给你一些随机性;一个简单的方法是这样的:

var seedGenerator = new Random();
for (var i = 0; i < 4; i++)
{
  var seed = seedGenerator.Next();
  // Launch each of the tasks however you want
  Task.Run(() => iniciarSupermercado(seed));
}

这将在你想要的任何时候,从你想要的任何线索中给你一粒种子。确保你不会一秒钟使用一百万次:)

这能回答你的问题吗?你能展示多线程的代码吗?你的问题与线程安全无关。
Random
的所有实例都只是使用相同的种子进行初始化,因为默认构造函数对该实例和同时启动的线程使用记号,记号值很可能不会更新。您需要为所有线程使用自定义种子(虚拟线程数等)或单个共享的
Random
var seedGenerator = new Random();
for (var i = 0; i < 4; i++)
{
  var seed = seedGenerator.Next();
  // Launch each of the tasks however you want
  Task.Run(() => iniciarSupermercado(seed));
}
public static SlowRandom
{
  private static readonly syncObject = new object();
  private static readonly Random generator = new Random();

  public static int Next()
  {
    lock (syncObject) return generator.Next();
  }
}