2011-12-16 5 views
6
I는 0과 3 사이의 임의의 숫자를 생성하고 싶은

을 얻는 확률을 변경하고 나는 내 코드에 다음과 같은 한 :은 임의의 숫자

int random = rand() % 4; 

이 잘 작동하지만 난 그게 1을 생성하고 싶습니다, 2 및 3 대부분의 시간 및 0 가끔 있습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 이 문제를 해결하기위한 일반적인 알고리즘의 이름은 무엇입니까?

+0

이것은 임의의 숫자가 아닙니다. 이것이 확률 분포입니다. 이것은 임의의 것과 반대입니다 (예측 가능성은 RNG에 대해 이야기 할 때 끔찍합니다). –

답변

15

한 가지 방법이 있습니다. 0, 1, 2, 3이 5 %, 20 %, 30 %, 45 %의 분포를 갖기를 원한다고 가정 해보십시오.
이처럼 할 수있는 : 그것은하지 않습니다 물론

double val = (double)rand()/RAND_MAX; 

int random; 
if (val < 0.05)  // 5% 
    random = 0; 
else if (val < 0.25) // 5% + 20% 
    random = 1; 
else if (val < 0.55) // 5% + 20% + 30% 
    random = 2; 
else 
    random = 3; 

은 부동 소수점으로 수행 할 수 있습니다. 더 직관적이어서이 방법을 사용했습니다. 당신이 원하는 정확히

+0

가치가있는 것을 위해, 이것은 내가 확률을 다룰 필요가있을 때 실제로 사용하는 방법입니다. –

0

테스트 한 번호는 몇 개입니까? 실제로 사실이라면 a = rand()%4000을 사용하여 0-> 3999의 범위를 생성하고 int = a/1000을 사용하면 외관상으로 생성 된 0의 무게를 제거해야합니다.

+1

나는 당신이 그 질문의 정확한 정반대를 묻는 것으로 오해하고 있다고 생각합니다. OP는 'rand() % 4'가 숫자를 고르게 분배하지만 0을 원한다는 것을 덜 자주 나타 내기를 원합니다. – ruakh

+1

OP가 * 부족한 제로를 원한다고 생각합니다. 그것은 관찰이 아니라 요구 사항입니다. –

+0

아하 나의 나쁜 여하튼 나는 그 문장에서'나는 맘에 든다. '라는 단어를 놓쳤다. – smitec

0

더 큰 세트에서 더 많은 값을 1,2,3으로 매핑합니다. 예를 들면 : 9와 1,2,3 => 1, 3,4,5 => 2, 6,7,8 => 3 및 0을 0으로 매핑하십시오. 다른 방법이 있지만 질문 범위 내에서 작업하고 있습니다

0

그냥 코드 :

int myrand(void) 
{ 
    const int percentZero = 10; 
    if ((rand()%100) < percentZero) return 0; 
    return 1 + (rand() % 3); 
} 

당신은 시간 제로의 비율을 변경할 수 있습니다 당신이 원하는대로 반환됩니다.

1

정확한 비율은 지정하지 않았지만 각각 32 %의 시간에 1, 2 및 3을 발생시키고 나머지 4 %는 0으로 설정한다고 가정합니다. 그럼 당신은 쓸 수 :

int random = rand() % 25; 
if(random > 0) 
    random = random % 3 + 1; 

을 (물론 당신이 다른 비율에 대한 것을 조정해야 할 것 그리고 위의 한 방법이며, 많은 유사한 접근 방법 일 수 있습니다.).

0

을 당신은 확률을 찾을 필요 귀하의 경우에 적합한 배포. 당신은 단지 숫자 0-3이 매우 쉽습니다에 대해 얘기하고 있기 때문에, 첫 번째 결과가 0이면 당신도 다시 rand() 부를 수있는, 또는 당신은 무게를 사용할 수 있습니다

int random = rand() % 16; 

if(random > 10) 
{ 
    random = 3; 
} 
else if(random > 5) 
{ 
    random = 2; 
} 
else if(random > 0) 
{ 
random = 1; 
} 

이 특히되지 않습니다 우아하지만, 필요에 따라 맞춤형 배포판을 만드는 방법을 보여줍니다.

6

random_distribution 클래스를 임의 라이브러리에서 사용할 수 있습니다.

#include <iostream> 
#include <random> 
#include <ctime> 

int main() 
{ 
    std::discrete_distribution<> dist({ 1.0, 4.0, 4.0, 4.0 }); 
    std::mt19937 eng(std::time(0)); 
    for (int i=0; i<100; ++i) 
     std::cout << dist(eng); 
} 

데모 : 당신이 C++ (11)를 사용할 수없는 경우 http://ideone.com/z8bq4

는, 이러한 클래스는 또한 부스트에 존재합니다.