"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como gerar números aleatórios somando um valor predefinido com igual probabilidade?

Como gerar números aleatórios somando um valor predefinido com igual probabilidade?

Publicado em 2024-11-08
Navegar:683

How to Generate Random Numbers Summing to a Predefined Value with Equal Probability?

Gerando números aleatórios somando a um valor predefinido

Neste contexto, pretendemos gerar uma lista de números pseudo-aleatórios que somam coletivamente até um valor específico predeterminado. Um método envolve gerar aleatoriamente um número dentro de um intervalo especificado, subtraí-lo do total e repetir esse processo até que a soma seja igual ao valor desejado. No entanto, esta abordagem favorece o primeiro número gerado em termos de sua contribuição para a soma.

Para garantir a uniformidade, uma solução mais sofisticada foi desenvolvida:

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

Este método gera uma lista de números inteiros positivos que somam o valor de destino. O conceito chave é que todas as combinações possíveis de números têm a mesma probabilidade de serem geradas. Além disso, estender essa técnica para diferentes totais e números variados de números aleatórios é simples.

Por exemplo, se definirmos n como 4 e total como 40, poderemos obter a seguinte saída: [4, 4, 25 , 7]. É importante observar que cada elemento desta lista, quando somado, produz o valor predefinido de 40.

Para permitir números inteiros não positivos, uma modificação está disponível:

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

Ao incrementar cada valor em um, podemos gerar uma lista de números inteiros não negativos que somam o total desejado.

Este método garante que todas as combinações possíveis, independentemente de os números serem positivos ou não negativos, tenham igual probabilidade de serem geradas. Com sua implementação amigável e versatilidade em diferentes cenários, constrained_sum_sample_pos e constrained_sum_sample_nonneg tornaram-se essenciais para tarefas de geração de números aleatórios em Python.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3