스레드 당 하나의 난수 생성기를 사용하는 방법을 찾고 동시에 프로그램을 다시 실행하면 동일한 숫자가 생성되도록하는 데 어려움을 겪고 있습니다. '데이터'목록을 작성 randomgenerator가 씨앗을 제공하고, 계산에 사용되는 randomgenerators가에 따라 씨앗을 제공하고 있기 때문에알려진 시드가있는 ThreadLocal 임의 생성기 만들기
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();
}
}
누구나이 문제에 대한 좋은 해결책을 생각할 수 있습니까?
나는 그것이 가능하지 않다고 생각합니다. 첫 번째 솔루션은 무작위 생성기 수가 스레드 수와 독립적이기 때문에 작동합니다. 두 번째 경우에는 스레드 당 하나의 랜덤 생성자를 생성 할 때 시드를 초기화하는 일관된 방법을 찾더라도 결과가 스레드 수에 따라 다릅니다. 새 번호를 생성 할 때마다 시드를 제공 할 수 있도록 임의의 사용자 지정 구현을 만들 수 있습니까? –
Bummer .. 매번 새로운 시드를 설정하는 것은 매번 새로운 랜덤을 인스턴스화하는 것과 동일하다고 생각합니다. – jkokorian
예, 그렇습니다. 스레드 당 하나의 무작위 인스턴스를 사용하려는 이유가 있습니까? –