2011-11-18 4 views
2

내 응용 프로그램에서 난수 생성기를 사용하고 있습니다. 그러나 때로는 똑같은 가치를 되 찾는 일이 종종 있습니다. 내 연구에 따르면 기본 임의 생성자는 시스템 시간을 시드로 사용합니다. 동일한 시드가 사용되면 같은 번호가 생성됩니다. 따라서 내 시스템 호출이 동일한 시스템 시간 (예 : 호출간에 지연이 거의없는 경우)에서 수행되면 동일한 숫자가 생성됩니다..NET 임의 번호 생성 - 자동 시드

그래서 좋게 보이는 솔루션은 약간의 호출을 지연시키는 것이므로 고유 한 시간이 소요됩니다. 내 질문은 무엇입니까 - 원자 시간 단위입니다 .NET 시드 생성기 - 그래서 고유 한 시간을 인식하고 고유 시드가 생성되도록 기다리는 데 사용할 수있는 가장 작은 숫자?

또한 스레드를 잠자기하는 것을 지연시키는 올바른 방법입니까? 예를

int smallestTimeUnit = 20; 
Thread.Sleep(smallestTimeUnit); 

에 대한

또는 시스템 시간 씨앗 생성이 신뢰할 수 없습니다 그리고 난 종자 세대 내 자신의 방법을 구현해야합니까?

감사합니다.

+7

이렇게 접근하는 잘못된 방법입니다. 당신이 순차적으로 사용하는'Random' 인스턴스를 갖는 것은 ** 멀리 선호됩니다 (즉, 매번'새로운 Random()'이 아닌 어딘가에 인스턴스를 저장하는 것입니다) –

답변

10

해결 방법은 동일한 Random 개체를 다시 사용하고 매번 새 개체를 만들지 않는 것입니다.

0

여러 번 호출되는 메서드의 난수를 일반화하는 경우 매개 변수로 임의 개체를 전달해야합니다.

var random = new Random(); 
for (var i=0; i<=1000; i++) 
{ 
    .... 
    foo(par, random); 
    .... 
} 

void foo(string somePar, Random rnd) 
{ 
    var val = rnd.next(); 
} 
1

이미 대답했듯이, 무작위의 단일 인스턴스를 만드는 것이 아마도 가장 좋은 방법 일 것입니다.

하지만 별도의 인스턴스를하고자 할 때, 당신은 쉽게 씨앗이 다른 확인 할 수는 :

static int baseSeed = 0; 

var r = new Random(baseSeed++); // not thread-safe 

씨앗은 서로 다르지만 반드시 무작위되지해야합니다. 1,2,3, .. seed를 사용하고 싶지 않다면 별도의 정적 Random 인스턴스를 사용하여 시드를 생성하십시오.

여러 스레드에서 사용하는 경우 Interlocked.Increment()를 사용하여 baseSeed를 변경하거나 static Random을 lock()합니다.

+0

왜 새로운 Random (baseSeed ++ + DateTime.TickCount) ? +1 어느 쪽이든 – jgauffin

+0

@jgauffin - 시간 하나를 사용하면 충분합니다 ('int baseSeed = TickCount;'). 매번 그것을 사용할 때 오버플로 문제가 발생합니다. –