2010-04-15 2 views
8

구조체의 배열을 가지며 구조체의 필드 중 하나가 float입니다. 나는 그것을 선택하는 확률이 float의 값에 비례하는 구조체 중 하나를 고르고 싶다. ie각 요소가 고유 한 확률을 갖는 목록에서 선택하는 C++ 함수

struct s{ 
    float probability; 
    ... 
} 

s sArray[50]; 

어떤 것을 고르는 것이 가장 빠른 결정입니까? 이 기능이 있습니까? 모든 확률 필드의 합을 알고 있다면 (1이 아님을 유의하십시오.) 각 s를 반복하고 probability/total_probability과 임의의 숫자를 비교하여 각 s의 난수를 변경 할 수 있습니까? ie

답변

9
float p = (rand()/static_cast<float>(RAND_MAX)) * total_probability; 
s* current = &sArray[0]; 
while ((p -= current->probability) > 0) 
    ++current; 
// `current` now points to your chosen target 
+0

s-> 확률은 현재 -> 확률, 정확해야합니까? – Stuart

+0

'rand()/static_cast (RAND_MAX)'는 항상 0 (매우 높은 확률) 또는 1 (매우 낮은 확률)입니다. 'rand()/static_cast (RAND_MAX)'를 대신 사용해보십시오. –

+0

'float ((float) rand()/RAND_MAX)'를 사용했습니다 : 그것은 저에게 효과적입니다. – Stuart

3

당신이 말한대로 RAND_MAX를 찾으십시오. RAND_MAX까지의 난수 생성. 생성 된 임의의 숫자와 같거나 초과 할 때까지 확률을 계산하는 배열을 반복합니다. 는 (50 소자 성능 달리 다른 배열 번 확률의 합계를 저장하고 임의의 값이로 이분 탐색을, 문제가되지 않을 것이다.)

+0

정확한 최적화 방법에 따라 배열은 무작위 요소를 선택하는 빈도와 비교하여 종종 수정되며 조기 최적화는 어쨌든 나쁜 계획입니다. 즉, 무작위 요소를 선택할 때마다 다시 계산할 필요가 없도록 배열을 생성하고 수정하는 동안 RAND_MAX를 최신으로 유지할 수 있습니다. 누적 확률을 저장하여 개별 확률을 반복하고 추가하는 대신 누적 확률에 대해 이진 검색을 수행 할 수 있습니다. – Cascabel

+0

@ Jefromi - 방금 그 비트를 답에 추가했습니다! 그 의견으로 정말 빠르다 !! –

+0

확률이 자주 바뀔 것입니다. 두 개의 객체가 무작위로 선택되고 배열의 하나 또는 두 개의 객체가 변경 될 수 있습니다. 이것은 여러 번 발생합니다. – Stuart

관련 문제