C++에서 어떤 일이 일어날 확률이 1/4인지 계산하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/326797

  •  11-07-2019
  •  | 
  •  

문제

스마트하게 알아낼 수 있는 방법이 있는지 궁금합니다.

무슨 일이 일어날 확률은 1/4이다.

나는 우리가 rand() % 4를 사용하여 이 작업을 수행하고 0과 같은지 확인할 수 있다는 것을 알고 있지만 rand()를 사용하지 않고 방법이 있습니까?C++에서는 감사합니다.

올바른 솔루션이 없습니다

다른 팁

당신이 많은 사람들의 본질적인 허접함을 피하고 싶다는 뜻이라면 rand() 구현에 대해서는 아마도 살펴봐야 할 것입니다. Boost Random 라이브러리, 에는 여러 가지 고품질 pRNG(의사 난수 생성기)와 출력을 제어하는 ​​다양한 방법이 있습니다.이 라이브러리는 약간 수정된 형태로도 제공됩니다. std::tr1.

절대 항상 PRNG 값을 범위로 잘라내는 데 %를 사용하십시오. 대부분의 PRNG는 상대적으로 비 랜덤 하위 주문 비트를 가지고 있습니다.

귀하의 경우 BCS가 제안한 것처럼 부서 (rand_max / n)를 사용하십시오.

random number generator

rand() < RAND_MAX/n;

C의 표준 rand ()가 마음에 들지 않으면 C보다 더 나은 랜드 ()를 선택하십시오.

당신은 당신의 자신의 랜드를 쓸 수 있습니다. (하지 마십시오).
진드기를 잡을 수 있습니다. (너무 자주하지 마십시오).
당신은 그냥 계산할 수 있고, 네 번째 전화는마다 진정으로 돌아갑니다.

아마도 rand ()를 호출해야 할 것입니다.

나는 C ++를 많이 모른다. 그래서 나는 틀렸을 것이다. 그러나 그것은 것 같습니다 rand() 사이에 값을 반환하십시오 0 그리고 RAND_MAX-1. 그래서 당신은 다음과 같은 일을 할 수 있습니다.

double odds = .25;

if(rand() <= RAND_MAX * odds) {
    // there should be .25 chance of entering this condition
}

추신 : 아마도 이것은 약간의 캐스팅이 필요합니다.

rand ()를 사용하지 않는 이유는 무엇입니까? "진정한"무작위성 대 유사 무작위성에 대해 걱정하는 경우 시도 할 수 있습니다. 무작위 비트의 물리적 소스 사용. 훨씬 더 복잡하고 일반적으로 불필요합니다.

다른 유형의 RNG를 사용할 수 있습니다. Mersenne Twister 전체 엔트로피가 더 좋습니다. 나는 또한 좋은 말을 듣습니다 캐리와 함께 RNGS.

4는 특별한 경우입니다. PRNG가 LIBC (RAND)의 LCG에 대해 짝수 숫자를 출력 할 가능성이 50%라고 가정 할 수 있습니다. 따라서 짝수 숫자를 두 번 출력 할 확률은 25%입니다.

그러므로...

bool rand_afourth(void)
{
    return !!((rand() & 1) & (rand() & 1));
}

그리고 지금은 pedantic을 위해 ...

당신이하고 싶은 것은 균일 한 무작위로 생성되지만 특정 범위로 제한되는 것입니다.이 경우 4의 엔트로피로 제한됩니다. PRNG (예를 들어, 32 비트 엔트로피가 있다면 출력을 계산하는 것이 확실 할 수 없습니다. 모드 4는 예상대로 작동합니다. 이것은 조금 더 많은 작업이 필요합니다.

다행히도이 작업은 이미 Boost Library에서 구현되었습니다.

boost::uniform_int<> aFourth(1,4)

예를 들어, 당신은 당신이 1 명 (또는 2, 3, 4, 공상)을 얻을 때마다 "OK"라고 말할 것입니다.

그러나 부스트 라이브러리를 사용하고 싶지 않을 수도 있습니다. 그런 다음 간단히 Uniform_int의 코드를보십시오 그리고 행동을 재현하십시오. 재능은 모방하고 천재는 훔친다. ;)

음 ... 자신의 글을 쓰십시오 rand()? 필요할 것이예요 약간 일종의 임의의 기능!

노력하다:

static int r = 0;
: : :
if ((r = (r+1)%4) == 0) {
    // do something.
}

그런 다음 IF 진술을 4 배의 배수로 실행한다고 가정 할 때 완벽한 25% 확률을 줄 수 있습니다.

u003C/humor>

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top