Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana Menjana Nombor Rawak dengan Jumlah Tetap, Pengagihan Seragam Dijamin?

Bagaimana Menjana Nombor Rawak dengan Jumlah Tetap, Pengagihan Seragam Dijamin?

Susan Sarandon
Susan Sarandonasal
2024-10-27 10:50:30663semak imbas

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

Menjana Nombor Rawak dengan Jumlah Tetap

Cabaran yang dikemukakan adalah untuk menjana satu siri nombor rawak pseudo yang jumlahnya sama dengan nilai yang telah ditetapkan . Khususnya, bagaimana untuk menjana empat nombor yang, apabila ditambah bersama, sama dengan 40.

Daripada bergantung pada kaedah yang boleh berat sebelah pengagihan nombor pertama, pendekatan yang lebih seragam digunakan. Penyelesaian menggunakan strategi membahagikan nilai yang dipratentukan kepada segmen yang lebih kecil, menggunakan pembahagi yang dipilih secara rawak.

Anggapkan kita mempunyai empat integer positif rawak (e, f, g, dan h) supaya 0 < e < f < g < h < 40. Kita boleh memperoleh empat nombor yang dikehendaki sebagai:

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

Teknik ini menjamin kebarangkalian yang sama untuk setiap set nombor, memastikan pengedaran seragam. Nombor rawak yang terhasil memenuhi keperluan penjumlahan kepada nilai yang telah ditetapkan.

Melanjutkan konsep ini, fungsi Python berikut menjana senarai rawak integer positif yang menjumlahkan kepada jumlah yang ditentukan:

<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>

Untuk menjana integer bukan negatif, transformasi tambahan digunakan:

<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>

Atas ialah kandungan terperinci Bagaimana Menjana Nombor Rawak dengan Jumlah Tetap, Pengagihan Seragam Dijamin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn