我正在努力寻找一种方法让每个线程都有一个随机数生成器,同时确保在重新运行程序时产生相同的数字。
我现在做的是这样的:
class Program {
static void Main(string[] args) {
var seed = 10;
var data = new List<double>();
var dataGenerator = new Random(seed);
for (int i = 0; i < 10000; i++) {
data.Add(dataGenerator.NextDouble());
}
var results = new ConcurrentBag<double>();
Parallel.ForEach(data, (d) => {
var result = Calculate(d, new Random(d.GetHashCode());
results.Add(result);
});
}
static double Calculate(double x, Random random) {
return x * random.NextDouble();
}
}
因为为创建“数据”列表的随机生成器提供了一个种子,并且为计算中使用的随机生成器提供了一个基于正在处理的数字的哈希码的种子,所以结果是可重复的。不管线程的数量和它们被实例化的顺序。
我想知道是否可以为每个线程仅实例化一个随机生成器。以下代码似乎可以实现这一点,但由于不再为随机生成器提供(可重现的)种子,因此结果不可重复。
class Program {
static void Main(string[] args) {
var seed = 10;
var data = new List<double>();
var dataGenerator = new Random(seed);
for (int i = 0; i < 10000; i++) {
data.Add(dataGenerator.NextDouble());
}
var results = new ConcurrentBag<double>();
var localRandom = new ThreadLocal<Random>(() => new Random());
Parallel.ForEach(data, (d) => {
var result = Calculate(d, localRandom.Value);
results.Add(result);
});
}
static double Calculate(double x, Random random) {
return x * random.NextDouble();
}
}
谁能想到一个很好的解决这个问题的方法?