2009-10-31 4 views
47

정말 이상합니다. 왜 이런 일이 발생하는지 알 수 없습니다. foreach주기에서 클래스 A 컬렉션을 반복하고 각 클래스에 대해 메서드를 호출합니다. 여기서 r1r2 숫자는 [-1,1] 범위에서 생성됩니다. 문제는 Random.Next이 각 인스턴스에 대해 동일한 "임의"숫자를 반환한다는 것입니다. 첫 번째 인스턴스에 대한 결과가 0 및 -1이면 다음 인스턴스에서 동일한 결과가 반환됩니다. 제발, 왜 이런 일이 일어 났는지 말해 줄 수 있어요? 또한 각 클래스 A 인스턴스에서 다른 결과를 얻을 수 없습니다.Random.Next는 항상 같은 값을 반환합니다.

class a 
{ 
Random rnd = new Random(); 
private void Count() 
{ 
    int r1 = rnd.Next(-1, 1); 
    int r2 = rnd.Next(-1, 1); 
} 
} 
class b 
{ 
List<a> listofA=new list<a>(); 
foreach (a ACLASS in listofA) 
{ 
    ACLASS.Count(); 
} 
} 

답변

94

문제는 당신이 시간에 너무 가까이 Random 클래스의 인스턴스를 생성하는 것입니다 :이 코드입니다.

Random 개체를 만들면 시스템 시계의 값으로 시드됩니다. Random 인스턴스를 너무 가깝게 만들면 모두 동일한 임의 시퀀스로 시드됩니다.

하나의 Random 개체를 만들고 각 "a"인스턴스에 하나의 Random 개체를 만드는 대신 "a"클래스의 인스턴스를 만들 때 생성자에 대한 참조를 전달합니다.

+1

-1,0보다 범위에서 당신에게 번호를주고, 내가 다시 하루에 대한 빙고 판지을 동일한 문제를 가지고하는 데 사용 클럽, 그리고 그 당시에는, 나는 남자에게 알려진 최악의 트릭을 사용했다 : 2 Ms.에 대한 스레드를 일시 중지 미숙하고 미친 ... 미친만큼, 나는 정적 임의의 선언과 함께 상단에 모든 것의. –

5

각 A 인스턴스에 대해 임의 인스턴스를 포함합니다. 모두 같은 기본 시드 값을 얻는 것 같습니다. 모든 A 인스턴스에 대해 정적 랜덤을 만들고 반복적으로 사용하거나 A 생성자의 Random() 인스턴스에 시드 값을 제공하려고합니다.

8

Random의 새 인스턴스를 매우 가깝게 만듭니다 (루프가 매우 좁음). 그러면 각 인스턴스가 동일한 시드 값을 효과적으로 사용합니다.

더 나은 방법은 하나의 인스턴스를 만들고이를 Count 메서드에 전달하는 것입니다.

당신은 problably이 다음 비트를 알고,하지만 난 완성도를 위해 여기에 포함됩니다 :

MSDN이에 대한 세부 사항을 가지고 있지만, 기본적 문제는 당신이 사용하고있는 Random.Next 방법은 생성입니다 :

minValue보다 크거나 같고 maxValue보다 작은 32 비트 부호있는 정수. 즉, 반환 값의 범위에는 minValue가 포함되지만 maxValue는 포함되지 않습니다. minValue가 maxValue와 같으면 minValue가 리턴됩니다.

때문에 통화가 반환이의

-1

7

를 사용하여 클래스의 모든 인스턴스에 대해 하나의 정적 랜덤 번호 생성기 0.

class a 
{ 
    private static Random rnd; 
    static a() { 
     rnd = new Random(); 
    } 
    private void Count() 
    { 
    int r1 = rnd.Next(-1, 2); 
    int r2 = rnd.Next(-1, 2); 
    } 
} 

주 변화는 나뿐만 아니라 잊어 -1,1 오히려

+0

나는이 범위에서 1을 반환 할 수 있다고 생각하는데 그들은 0과 -1 만 원합니까? – Lucas

+0

@Svante가 질문을 편집하여 코드 샘플과 일치하도록 간격을 열었습니다.원래 질문은 정확한 언어를 사용하지 않았지만 닫힌 간격을 지정했습니다. 코드가 올바르지 않아 닫힌 간격을 지정하는 질문을 복원 할 것입니다. – tvanfosson

+0

@ tvanfosson 왜 이것이 효과가 있는지 말해 줄 수 있습니까? 나는이 통계가 당신에게 임의성을주는 방법을 이해하지 못합니다. 나는 그것이 효과가 있다는 것을 안다. 그러나 이유는 아니다. 그들은 아직도 아주 가깝다. 감사. – johnny

관련 문제