2013-02-16 4 views
3

내가이있는 경우 : 를임의의 개체에서 임의의 숫자가 어떻게 작동합니까?

random1 = new Random(); 
Console.WriteLine(random1.Next(1, 100)); 
Console.WriteLine(random1.Next(1, 100)); 

나는 그것이 내가 console.writeline를 호출 할 때마다 대해 다른 번호를 생성거야가 (난 이미 변수 선언), 그래서 이것은 예를 생성합니다. 10, 55 그리고 만약 당신이 다시 20,60 그래서 기본적으로 임의의 숫자 매번, 좋은. 하지만 추가 할 때이 :

random2 = new Random(); 
Console.WriteLine(random1.Next(1, 100)); 
Console.WriteLine(random1.Next(1, 100)); 
Console.WriteLine(random2.Next(1, 100)); 
Console.WriteLine(random2.Next(1, 100)); 

Random1가 같은 번호가 무작위로 생성됩니다! 그럼 전예요. 5,54,5,54 그리고 만약 내가 다시 70,34,70,34. 하지만 random2는 새로운 객체입니다. 왜 random1과 동일한 숫자를 생성합니까?

또 다른 예 : 나는이

randomnumberobject = new RandomNumber(); 
randomnumberobject2 = new RandomNumber(); 
Console.WriteLine(randomnumberobject.getrandomnumber); 
Console.WriteLine(randomnumberobject2.getrandomnumber); 

을 수행 한 후이

class RandomNumber 
    { 
     Random random = new Random(); 
     public int getrandomnumber { get { return random.Next(1, 5); } } 
    } 

같은 클래스 그들은 임의의 숫자를 생성 할 수 있습니다,하지만 둘 다 똑같은 난수를 생성하는 경우 . 그래서 처음으로이 5,3 초를 얻었습니다.이 3,3 등등. 나는이

class RandomNumber 
    { 
     Random random; 
     public int getrandomnumber { get { return random.Next(1, 5); } } 
     public RandomNumber(Random random) { this.random = random; } 
    } 

에 클래스를 변경하고 대신

random = new Random(); 
    randomnumberobject = new RandomNumber(random); 
    randomnumberobject2 = new RandomNumber(random); 
    Console.WriteLine(randomnumberobject.getrandomnumber); 
    Console.WriteLine(randomnumberobject2.getrandomnumber); 

갑자기 이렇게하면 는하지만, 그들은 모두 서로 다른 난수를 생성! 그런데 왜 이런 일이 일어 났습니까? 이유가 뭐야? 나는 아직도 초보자 다.

+3

[docs] (http://msdn.microsoft.com/en-us/library/system.random.aspx)의 비고 섹션의 두 번째 단락을 참조하십시오. "기본적으로 Random 클래스의 매개 변수없는 생성자는 시스템 시계를 사용하여 시드 값을 생성하지만 매개 변수화 된 생성자는 현재 시간의 틱 수를 기반으로 Int32 값을 취할 수 있지만 시계가 유한 해상도이므로 매개 변수없는 생성자를 사용하여 서로 다른 무작위 객체를 연속적으로 생성하여 동일한 시퀀스의 난수를 생성하는 난수 생성기를 만듭니다. – RobH

+0

무작위 수를 파헤칩니다. 그것은 모두 거기에 있습니다. 매번 동일한 순서의 난수를 원할 때가 있고 때로는 그렇지 않은 경우가 있습니다. –

답변

5

당신이 보는 것은 "설계 상"입니다 - 즉 클래스가 어떻게 구현 되었기 때문에 발생합니다 ... 사용하는 알고리즘은 "시드"(시작 상태의 종류)가 필요합니다.이 경우에는 시계 ...에 기록 된대로 MSDN :

난수 생성은 시드 값에서 시작됩니다. 동일한 시드를 반복적으로 사용하면 동일한 일련의 숫자가 생성됩니다. 하나의 다른 시퀀스를 만드는 방법은 시드 값을 시간 종속적으로 만드는 것입니다. 따라서 각각 새로운 인스턴스가 무작위 인 다른 계열을 생성합니다. 기본적으로 Random 클래스의 매개 변수가없는 생성자는 시드 값을 생성하는 데 시스템 시계를 사용하고 매개 변수화 된 생성자는 현재 시간의 틱 수를 기반으로 Int32 값을 취할 수 있습니다. 그러나 시계에 유한 해상도가 있으므로 매개 변수없는 생성자를 사용하여 서로 다른 임의의 개체를 연속적으로 생성하면 임의의 숫자 시퀀스를 생성하는 임의의 숫자 생성자가 생성됩니다. 다음 예제에서는 인 두 개의 임의 개체가 연속적으로 인스턴스화되어 동일한 일련의 임의 숫자를 생성 함을 보여줍니다. 이 두 Random 객체가 매개 변수가 생성자를 사용하여 거의 동시에 생성되는 경우들이 클럭에 기초하여, 동일한 "시작 상태"로 초기화 되었기 때문에 그들은 동일한 난수 시퀀스를 생성 할 것을 기본적 수단

.

+0

죄송합니다. 인터넷이 다운되었습니다. 나 한테 이걸 지울 수있어? 그래서 똑바로 세 번째 예제는 작동하지 않을 것입니다. 왜냐하면 같은 클래스에있는 두 개의 다른 객체 일지라도, 두 객체의 새로운 객체를 동시에 만들면 클래스의 "임의의"객체가 두 객체 모두 동일한 "시작 상태"를 가져 옵니까? – CsharpFrustration

+0

@CsharpFrustration 네 정확히 ... 다른 컨스트럭터를 사용하고 다른 "시드"(즉, 시작 상태 "Int32 만 제공)를 변경하면됩니다. – Yahia

+0

아, 알겠습니다. 고맙습니다. – CsharpFrustration

0

난수 생성은 대부분의 프로그래밍 언어에서 시드 값을 기반으로 작동합니다. 이 시드는 일반적으로 현재 시간 값에서 가져옵니다. 따라서 두 무작위 객체를 서로 가깝게 선언하면 CLR에서 동일한 시드를 얻을 가능성이 큽니다. 그래서 같은 번호를 생성합니다.

동일한 인스턴스를 사용하는 경우 첫 번째 두 숫자는 이미 임의 순서에서 나왔으므로 다음 두 숫자는 동일하지 않습니다.

이러한 상황 (int 값으로 오버로드 된 Random의 생성자)에서 명시 적 시드를 사용하십시오.

0

마지막 예제에서 매번 다시 시드하기 때문에 임의의 개체를 다시 시드하지 않으면 매번 동일한 임의의 숫자 풀에서 풀 (pull)됩니다.

 var random1 = new Random(DateTime.Now.Millisecond); 
     Console.WriteLine(random1.Next(1, 100)); 
     Console.WriteLine(random1.Next(1, 100)); 
     Console.WriteLine(random1.Next(1, 100)); 
     Console.WriteLine(random1.Next(1, 100)); 

     var random2 = new Random(DateTime.Now.Millisecond); 
     Console.WriteLine(random2.Next(1, 100)); 
     Console.WriteLine(random2.Next(1, 100)); 
관련 문제