2011-08-10 9 views
3

나는 이것에 대해 어떻게 생각하는지 잘 모르겠습니다.랜덤 어커런스

다른 확률로 14,296 개의 난수를 생성해야합니다.

예를 들어, 숫자 18, 1 및 17이 포함 된 배열이 필요합니다. 각 숫자마다 발생 확률이 다릅니다. 그래서 :

55 % = 18
(7,862.8 회)

30 % = 1
(4,288.8 회)

15 % = 17
(2,144.4 회)

결과는 new Array() {18, 18, 1, 17, 1, 18 ...}

과 비슷할 것입니다.3210
+0

가 명확히 :

그럼 단지 숫자를 선택하기 위해 다음과 같이? – JYelton

+0

입력이 맞으면 출력은 크기 N과 N/a의 배열입니다. –

+0

의 값을 가진 확률 요소 많은 좋은 답변들, 나는이 시간을 고르는 것이 어느 것인지를 알지 못한다! –

답변

1
Random r = new Random(); 

// for each number to generate 
int nextNumber; 
double probability = r.NextDouble(); 
if (probability < 55.0/100.0) 
    nextNumber = 18; 
else if (probability < (55.0 + 30.0)/100.0) 
    nextNumber = 1; 
else 
    nextNumber = 17; 
4

항상 정수 백분율로 값을 가지면 확률에 따라 값이 100 개의 요소 배열을 채울 것입니다.이 경우 배열의 개수는 18 회, 30 회는 1 회, 15 번 발생합니다. 그런 다음 해당 배열에서 14,296 개의 임의 값을 선택하면됩니다. (즉, [0, 100] 범위의 정수를 선택하여 해당 요소를 가져옵니다.)

확률을 표현하는 다양한 방법에는 물론 다른 접근 방법이 있습니다. 그러나 정수 비율을 지정하면 이는 쉽게 이해할 수있는 옵션입니다. (또 다른 방법은 모든 확률을 합계, 즉 [0, 1]의 범위로 확장 한 다음 해당 범위에서 임의의 double을 취하는 것입니다.)

2

임의 생성기의 범위를 비례 세그먼트로 나누고, 다음 난수가 어느 세그먼트로 떨어 졌다고 판단하여 세트에서 해당 번호를 선택하십시오. (간체) 같은

뭔가 : 물론

const int numbers[3] = { 1, 17, 18 }; 
const int borders[2] = { 0.30*MAX_RANDOM, (0.30 + 0.15) * MAX_RANDOM }; 

int i = random.next(), num; 

if  (i < borders[0]) num = number[0]; 
else if (i < borders[0]) num = number[1]; 
else num = number[2]; 

세보다 더 많은 숫자가 있다면, 그것은 루프를 사용하는 것이 좋습니다.

참고 : Jon Skeet의 솔루션과 달리이 프로그램은 엄격하게 1 %가 아닌 최대 1/(MAX_RANDOM + 1) (32 비트 컴퓨터에서 최대 2^32)의 원하는 세분성을 제공 할 수 있습니다.

0

당신은 3 개 개의 숫자의 각각의 해당 번호 List<T>, 다음 randomize the List을 채울 수 있습니다. 이 (안된) 같은 것에 대해 어떻게

1

:

struct np 
{ 
    int n; 
    int p; 
} 

List<np>를 만들고 값/비율 쌍 (예를 들어, n = 18, p = 55)와 함께 것이다. 입력이 숫자 1) 세트 연관 원하는 확률로 각각 2) 원하는 출력 배열 크기이다

List<np> npl = new List<np>(); 
// (fill the list here) 



int r = rnd.next(total_of_all_p_values); // get random number 
int res = 0; // result 
for(int i = 0; i < npl.Length(); r -= npl[i++].n) 
{ 
    if(r < npl[i].p) // remaining vlaue is smaller than current percentage 
    { 
     res = npl[i].n; 
     break; 
    } 
} 
+0

예, 솔루션입니다. – vines