2012-12-12 1 views
5

가능한 중복은 :
Random number generator only generating one random number디버거를 사용하여 코드를 실행하는 경우에만 코드가 올바르게 실행됩니까?

나는 조금이 몇 분 전으로 당황했다. (시스템 시간 기준)

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 
    int makeBlockOfType = random.Next(0, 100); 

    blockType t = blockType.normal; 
    if (makeBlockOfType <= 80 && makeBlockOfType >= 60) 
    { 
     t = blockType.blue; 
    } 
    else if (makeBlockOfType > 80 && makeBlockOfType <= 95) 
    { 
     t = blockType.orange; 
    } 
    else if (makeBlockOfType > 95 && makeBlockOfType <= 100) 
    { 
     t = blockType.green; 
    } 

    return t; 
} 

상당히 간단 그것은 임의로 생성 된 번호에 기초하여 값을 복귀 enum : I는 다음의 코드를 갖는다. 불행히도 어떤 이상한 이유가 있기는하지만 모든 블록이 하나의 색이나 다른 블록으로 구성되어 있어도 모든 블록이 게임에 적용됩니다. 그러나 디버거를 사용하여 단계를 밟은 후 일부 실행 후에 결과를 확인하면 블록이 현재 제공되는 기회에 따라 여러 색상으로 표시되는 것을 볼 수 있습니다. 나는 이것이 왜 일어나고 있는지에 대해 약간 혼란 스럽다.

이 경우 Microsoft 용 대신 Mono 컴파일러를 사용하는 MonoGame을 사용하고 있습니다. 이것이 문제가 될 수 있습니까? 나는이 코드를 생성자에 인라인으로 넣으려고 시도했지만 어디에서 호출되는지는 같지만 동일한 결과를 얻고있다. (필자는 컴파일러가 코드를 인라인한다고 추측한다.)

Visual Studio를 별도로 다시 시작하려고했지만 빌드를 실행하지 마십시오. 변경 사항 없음.

모든 제안과 도움을 받으실 수 있습니다.

+1

시도를하는 방법에서 임의의 생성을 이동, 그 도움이 될 것입니다. –

+0

'새로운 Random()'시드는 시간을 사용하는데 몇 밀리 초 동안 일정하게 유지됩니다. – CodesInChaos

+0

디버그에서 작동하는 이유는 호출 사이에 시간이 있기 때문에 무작위가 실제로 다른 종자를 얻습니다. – Archy

답변

3

매우 짧은 기간에 Random의 여러 인스턴스를 연속적으로 만들면 동일한 시간 종속 시드 값으로 초기화 될 수 있습니다.

는이 문제를 해결하려면, 대신 인스턴스 필드로 Random를 초기화해야합니다

private readonly Random random = new Random(); 

public blockType generateRandomBlock() 
{ 
    int makeBlockOfType = random.Next(0, 100); 

    // ... 
} 
7

당신은 한 번만 (생성자에서 개인 필드와 실체화로 설정) 랜덤를 실체화한다, 유사한 참조 질문 : 시드 값에서

난수 생성 시작 : Random.Next returns always the same values

Random documentation를 참조하십시오. 같은 씨가 반복적으로 사용하는 경우, 숫자의 같은 시리즈는 귀하의 경우에는

를 생성, 당신은 (시간에 너무 가까이) 같은 씨와 임의의 인스턴스를 생성 할 것이다 당신은 첫 번째 값을 주어진 씨앗에 대해서도 마찬가지입니다. 난수 생성기의 씨앗으로

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 

이 연속 통화에 대해 동일한 값을 반환 시간을 기반으로합니다

4

당신은 때마다 당신이 당신의 메소드를 호출하여 난수 생성기를 다시하고 있습니다.

루틴 외부 발전기의 당신의 생성을 이동 :

Random random = new Random(); 
public blockType generateRandomBlock() 
{ 
관련 문제