>  기사  >  백엔드 개발  >  고정된 합계와 균일한 분포를 보장하는 난수를 생성하는 방법은 무엇입니까?

고정된 합계와 균일한 분포를 보장하는 난수를 생성하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-27 10:50:30765검색

How to Generate Random Numbers with a Fixed Sum, Guaranteed Uniform Distribution?

고정 합계로 난수 생성

문제는 합계가 미리 정의된 값과 동일한 일련의 의사 난수를 생성하는 것입니다. . 구체적으로, 더하면 40이 되는 4개의 숫자를 생성하는 방법입니다.

첫 번째 숫자의 분포를 편향시킬 수 있는 방법에 의존하는 대신 보다 균일한 접근 방식이 사용됩니다. 이 솔루션은 무작위로 선택된 구분자를 사용하여 미리 정의된 값을 더 작은 세그먼트로 나누는 전략을 활용합니다.

0 < 전자 < f < g < h < 40. 원하는 4개의 숫자를 다음과 같이 도출할 수 있습니다.

a = e
b = f - e
c = g - f
d = 40 - g

이 기술은 각 숫자 집합에 대해 동일한 확률을 보장하여 균일한 분포를 보장합니다. 결과 난수는 미리 정의된 값으로 합산해야 하는 요구 사항을 충족합니다.

이 개념을 확장하여 다음 Python 함수는 지정된 총합으로 합산되는 양의 정수의 임의 목록을 생성합니다.

<code class="python">import random

def constrained_sum_sample_pos(n, total):
    """Return a randomly chosen list of n positive integers summing to total.
    Each such list is equally likely to occur."""

    dividers = sorted(random.sample(range(1, total), n - 1))
    return [a - b for a, b in zip(dividers + [total], [0] + dividers)]</code>

음수가 아닌 정수를 생성하려면 추가 변환이 사용됩니다:

<code class="python">def constrained_sum_sample_nonneg(n, total):
    """Return a randomly chosen list of n nonnegative integers summing to total.
    Each such list is equally likely to occur."""

    return [x - 1 for x in constrained_sum_sample_pos(n, total + n)]</code>

위 내용은 고정된 합계와 균일한 분포를 보장하는 난수를 생성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.