2009-09-17 8 views
1

저는 임의의 직사각형 배열을 만들어야하는 연습용 C# 코드를 작성했습니다.C#의 난수 생성

내 GetRandomRectangle 함수에 의해 생성되는 사각형이 항상 같았습니다. System.Random을 사용하여 사각형의 좌표를 생성했습니다.

랜덤 개체가 기본 생성자로 작성되어 동일한 시드가 있었으므로 그 사실을 알았습니다. 각 사각형에 대해 다른 시드를 얻도록 수정했습니다. 제대로 작동합니다.

질문은 '기본 시드'를 어떻게 결정합니까? 나는 시간이 지남에 따라 변하지 않는 것으로 나타났습니다. 시드 2로 생성 된 사각형에는 항상 동일한 차원이 주어집니다.

아마도 Google이 될 수 있지만, 의견이나 의견을 듣는 것도 좋습니다.

고마워요 :)

+0

기본 시드를 어떻게 결정합니까? 당신의 발견에 따라 무작위로 아닙니다! 물론, 무작위로 그런 것은 없지만, 그것은 완전히 다른 토론입니다. – Bryan

+0

중복 : http : // stackoverflow.com/questions/807892/why-does-this-method-return-the-random-string-each-time – Guffa

+0

나는 그 질문을 알고 있었고 그것이 중복 된 것 같지 않습니다. 이 사용자는 코드가 작동하지 않는 이유를 알고 싶어했습니다. 나는 이것이 씨앗 때문이라는 것을 알고 있으며 난수 생성에 사용 된 메커니즘에 대해 더 알고 싶었습니다. –

답변

11

기본 시드는 시스템 시계에서 가져옵니다.

여러분의 GetRandomRectangle 메서드가 빠르게 연속해서 호출되고 매번 Random의 새 인스턴스를 인스턴스화 한 것 같습니다. 이렇게하면 Random의 각 인스턴스는 시스템 시계에서 동일한 시드를 가져옵니다. 따라서 매번 동일한 방법으로 동일한 사각형이 만들어집니다.

하나의 해결책은 예를 Random의 생성 및 방법에 그것을 전달하는 것입니다 :

Random rng = new Random(); 

Rectangle foo = GetRandomRectangle(rng); 
Rectangle bar = GetRandomRectangle(rng); 
Rectangle baz = GetRandomRectangle(rng); 

// ... 

public Rectangle GetRandomRectangle(Random rng) 
{ 
    // create the rectangle using rng 
} 
+0

이 작업을 수행하고 프로그램을 실행 한 다음 닫은 다음 몇 초 사이에 다시 실행하면 동일한 사각형 세트가 생성되는 것으로 보입니다. 재미있는 ... –

+0

왜냐하면 시드로 타임 스탬프를 사용하기 때문입니다. 대신 똑같은 씨앗을 얻지 못하도록 tickcount를 사용해야합니다. –

+1

@cemkalyoncu : 기본'Random' 생성자는'Environment.TickCount'를 시드로 사용합니다. 나는 그게 문제라고 여기지 않는다. – LukeH

0

당신이 씨앗을 사용, 이것은 당신이 그 씨앗에서 시작하는 같은 순서를 원하는 것을 의미

시드없이 생성자를 시도하십시오.

1

사실 기본 생성자는 시간에 따라 다르므로 응용 프로그램 실행시 다른 출력을 제공해야합니다 양이온 두 번째. 매번 똑같은 직사각형을 얻는다면 다른 무언가가 진행되어 왔음에 틀림 없습니다.

시드를 수동으로 제공하면 항상 동일한 의사 난수 시퀀스가 ​​제공됩니다.

임의의 숫자를 모두 생성하려면 Random 개체를 인스턴스화해야합니다. 각 사각형에 대해 새 인스턴스를 만들지 마십시오.

+0

@Thorarin : 여러 개의 랜덤 인스턴스를 연속적으로 (예 : 꽉 짜인 루프로) 만들면 동일한 시드를 사용하게됩니다. 그 상황에서 시스템 클록은 각 인스턴스. – LukeH

+0

@ 루크 : 따라서 단일 인스턴스 사용에 대한 내 의견. – Thorarin

1

필자도 사용 했었지만 충분히 임의의 값을 생성하지 못했습니다. 대신 암호 네임 스페이스 내 임의의 기능으로 전환했습니다. 다음은 오류 검사 또는 화면 크기 변환없이 매우 간단한 버전의 :

 byte[] randomBytes = new byte[4]; 
    RandomNumberGenerator numberGenerator = System.Security.Cryptography.RandomNumberGenerator.Create(); 
    numberGenerator.GetNonZeroBytes(randomBytes); 
    int x = randomBytes[0]; 
    int y = randomBytes[1]; 
    int width = randomBytes[2]; 
    int height = randomBytes[3]; 
    System.Drawing.Rectangle block = new Rectangle(x, y, width, height); 
+3

Random 클래스는 올바르게 사용하면 대부분의 용도에 충분한 난수를 생성합니다. 암호화 난수 생성기는 암호화 키를 만드는 경우와 같이 매우 뛰어난 난수가 필요할 때만 필요합니다. – Guffa

0

임없이 C#을 전문가 만이 작동 할 수 있습니다.

public Rectangle GetRandomRectangle() 
{ 
     static Random rng=new Random(); 
     // create the rectangle using rng 
}