을 얻는 확률을 변경하고 나는 내 코드에 다음과 같은 한 :은 임의의 숫자
int random = rand() % 4;
이 잘 작동하지만 난 그게 1을 생성하고 싶습니다, 2 및 3 대부분의 시간 및 0 가끔 있습니다.
이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 이 문제를 해결하기위한 일반적인 알고리즘의 이름은 무엇입니까?
을 얻는 확률을 변경하고 나는 내 코드에 다음과 같은 한 :은 임의의 숫자
int random = rand() % 4;
이 잘 작동하지만 난 그게 1을 생성하고 싶습니다, 2 및 3 대부분의 시간 및 0 가끔 있습니다.
이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 이 문제를 해결하기위한 일반적인 알고리즘의 이름은 무엇입니까?
한 가지 방법이 있습니다. 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;
은 부동 소수점으로 수행 할 수 있습니다. 더 직관적이어서이 방법을 사용했습니다. 당신이 원하는 정확히
가치가있는 것을 위해, 이것은 내가 확률을 다룰 필요가있을 때 실제로 사용하는 방법입니다. –
테스트 한 번호는 몇 개입니까? 실제로 사실이라면 a = rand()%4000
을 사용하여 0-> 3999의 범위를 생성하고 int = a/1000
을 사용하면 외관상으로 생성 된 0의 무게를 제거해야합니다.
더 큰 세트에서 더 많은 값을 1,2,3으로 매핑합니다. 예를 들면 : 9와 1,2,3 => 1, 3,4,5 => 2, 6,7,8 => 3 및 0을 0으로 매핑하십시오. 다른 방법이 있지만 질문 범위 내에서 작업하고 있습니다
그냥 코드 :
int myrand(void)
{
const int percentZero = 10;
if ((rand()%100) < percentZero) return 0;
return 1 + (rand() % 3);
}
당신은 시간 제로의 비율을 변경할 수 있습니다 당신이 원하는대로 반환됩니다.
정확한 비율은 지정하지 않았지만 각각 32 %의 시간에 1, 2 및 3을 발생시키고 나머지 4 %는 0으로 설정한다고 가정합니다. 그럼 당신은 쓸 수 :
int random = rand() % 25;
if(random > 0)
random = random % 3 + 1;
을 (물론 당신이 다른 비율에 대한 것을 조정해야 할 것 그리고 위의 한 방법이며, 많은 유사한 접근 방법 일 수 있습니다.).
을 당신은 확률을 찾을 필요 귀하의 경우에 적합한 배포. 당신은 단지 숫자 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;
}
이 특히되지 않습니다 우아하지만, 필요에 따라 맞춤형 배포판을 만드는 방법을 보여줍니다.
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
는, 이러한 클래스는 또한 부스트에 존재합니다.
이것은 임의의 숫자가 아닙니다. 이것이 확률 분포입니다. 이것은 임의의 것과 반대입니다 (예측 가능성은 RNG에 대해 이야기 할 때 끔찍합니다). –