2013-10-25 3 views
2

서로 다른 두 개의 난수를 생성하고 싶습니다. 나는 동일한 값 getRandNum1 발생하지 getRandNum2에게 어떻게다른 2 개의 난수 생성하기 C#

Random ran = new Random(); 
int getRanNum1 = ran.Next(10); 
int getRanNum2 = ran.Next(10); 

: 첫 번째 난수 5 생성하는 경우 예를 들어, 나는 다음 난수 5. 동일하지 않은이 지금까지 내 코드를 생성합니다 ? 루프와

+3

'getRanNum2'가 조금 덜 랜덤하다는 것을 알고 계십니까? 특히 '0..9'와 같은 작은 범위. –

답변

13

:

루프 및 검사 방법이 여기 가능성이 적합하지만,이 질문의 변종이 "어떻게 범위에서 N 별개의 난수를 얻을 수 (또는 설정)하는 것입니다
int getRanNum2 = ran.Next(10); 
while(getRanNum2 == getRanNum1) 
    getRanNum2 = ran.Next(10); 
5

? "

그 한 가지 가능한 대안 (그리고 내가 좋아하는 이유는이 대답을 작성한 이유입니다)은 상기 범위 (또는 설정)를 구축하고 shuffle the items을 작성한 다음 첫 번째 N 개 항목을 가져 오는 것입니다.

피셔 - 예이츠 셔플 구현은 in this answer입니다. 약간의 상황에 대한 정리 :

void Shuffle (int arr[]) { 
    Random rnd = new Random(); 
    for (int i = arr.Length; i > 1; i--) { 
    int pos = rnd.Next(i); 
    var x = arr[i - 1]; 
    arr[i - 1] = arr[pos]; 
    arr[pos] = x; 
    } 
} 

// usage 
var numbers = Enumerable.Range(0,10).ToArray(); 
Shuffle(numbers); 
int getRanNum1 = numbers[0]; 
int getRanNum2 = numbers[1]; 

우리가 N (2) 요소가 선택되고 있다는 것을 알고 있기 때문에, 위의 Shuffle 방법은 실제로 단지 N (2) 교환이 완료되도록 수정할 수 있습니다. 이는 각 i에 대해 arr[i - 1]이 (자체와 교체 될 수는 있지만) 한 번만 스왑되기 때문입니다. 어쨌든, 이것은 독자를위한 운동으로 남겼습니다.