실제로이 작업을 수행 하는 코드를 작성 했습니다 . 그것의 요지는 불행한 줄무늬를 교정하기 위해 통계를 사용하고 있습니다. 이를 수행하는 방법은 이벤트가 발생한 횟수를 추적하고이를 사용하여 PRNG에 의해 생성 된 수를 바이어스하는 것입니다.
먼저, 이벤트 비율을 어떻게 추적합니까? 이 작업을 수행하는 순진한 방법은 메모리에 생성 된 모든 숫자를 유지하고 평균을내는 것입니다. 약간의 생각 후에 나는 다음을 생각해 냈습니다 (기본적으로 누적 이동 평균입니다 ).
다음 PRNG 샘플을 가져옵니다 (샘플이> = 0.5 인 경우 처리).
Values: 0.1, 0.5, 0.9, 0.4, 0.8
Events: 0 , 1 , 1 , 0 , 1
Percentage: 60%
각 값은 최종 결과의 1/5에 기여합니다. 다른 방법으로 살펴 보자.
Values: 0.1, 0.5
Events: 0 , 1
공지 그 0
값의 50 %에 기여하고 1
기여 값의 50 %. 약간 더 나아 가기 :
Values: [0.1, 0.5], 0.9
Events: [0 , 1 ], 1
이제 첫 번째 값은 값의 66 %와 마지막 33 %에 기여합니다. 우리는 기본적으로 이것을 다음 프로세스로 분리 할 수 있습니다.
result = // 0 or 1 depending on the result of the event that was just generated
new_samples = samples + 1
average = (average * samples / new_samples) + (result * 1 / new_samples)
// Essentially:
average = (average * samples / new_samples) + (result / new_samples)
// You might want to limit this to, say, 100.
// Leaving it to carry on increasing can lead to unfairness
// if the game draws on forever.
samples = new_samples
이제 PRNG에서 샘플링 한 값의 결과를 편향시켜야합니다. 여기서 RTS의 랜덤 한 양의 손상과 비교할 때 훨씬 쉬울 것입니다. '나에게 일어난 일'이기 때문에 설명하기 어려울 것입니다. 평균이 낮을 경우 이벤트 발생 가능성을 높이고 비자 수반해야 함을 의미합니다. 몇 가지 예
average = 0.1
desired = 0.5
corrected_chance = 83%
average = 0.2
desired = 0.5
corrected_chance = 71%
average = 0.5
desired = 0.5
corrected_change = 50%
이제 나에게 발생한 것은 첫 번째 예에서 83 %가 "0.5에서 0.5"(즉, "0.5에서 0.5 + 0.1")에 불과했습니다. 무작위 이벤트 용어로 다음 중 하나를 의미합니다.
procced = (sample * 0.6) > 0.1
// or
procced = (sample * 0.6) <= 0.5
따라서 이벤트를 생성하려면 기본적으로 다음 코드를 사용하십시오.
total = average + desired
sample = rng_sample() * total // where the RNG provides a value between 0 and 1
procced = sample <= desired
따라서 요점에 넣은 코드를 얻습니다. 나는이 모든 것이 무작위 피해 사례 시나리오에서 사용될 수 있다고 확신하지만, 그 사실을 알아내는 데 시간이 걸리지 않았습니다.
면책 조항 : 이것은 모든 가정에서 얻은 통계이며, 현장에서 교육을받지 못했습니다. 내 단위 테스트는 통과합니다.