Iterando em uma lista aleatória

16 views
Skip to first unread message

Doriedson

unread,
Jun 23, 2024, 2:55:58 PM (9 days ago) Jun 23
to Python Brasil
Olá a todos.

O problema é o seguinte: montar uma fila aleatória de pessoas, cada indivíduo possui um 'raio de ação'; esse raio indica quantas pessoas serão afetadas a partir de cada indivíduo. Isto é, no caso dos raios [2, 1, 1, 0]: a primeira pessoa afeta outras duas (a segunda e a terceira), a segunda pessoa, por sua vez, afeta uma (a terceira), o mesmo vale para a terceira que afeta somente a quarta, que, por fim não afeta ninguém. Em outras palavras, ainda, o raio indica a quantidade mínima de vizinhos sucessores que cada indivíduo tem.
Preciso criar uma lista que atenda esse critério de vizinhos mínimos e, consequentemente, atenda o critério do último indivíduo ter raio igual a zero.

Uma das minhas tentativas: sortear três inteiros aleatórios (no intervalo [0, 20]), caso o primeiro seja igual a zero, o primeiro indivíduo terá zero sucessores, portanto a lista foi completa; entretanto se o primeiro for qualquer inteiro maior que zero inicia-se um laço while. Consegui fazer esse laço checar se cada indivíduo possuía a quantidade mínima de vizinhos, caso não tivesse todos vizinhos subsequentes seriam substituídos por uma nova lista aleatória, agora com o tamanho correto.

O erro: não consegui fazer um laço que verificasse de uma vez as duas condições, pois essa lista tem que acabar se todos números tem a quantidade mínima de vizinhos sucessores E o último indivíduo é zero.

``` python
from scipy.stats import geom as gge

def novodia2(prob):
    """"""
    rr = list(gge.rvs(size=3, p=prob) - 1)
    cont, radius = 0, rr
    while True:
        if radius[0] == 0:
            print('End!')
            radius = [0]
            break
        else:
            try:
                if radius[cont] > len(radius[cont: ]):
                    ademais = list(gge.rvs(size=radius[cont] + 1, p=prob))
                    radius[cont + 1:] = ""
                    radius += ademais
                    cont += 1
                else:
                    cont += 1

            except IndexError:
                radius += list(gge.rvs(size=1, p=prob))
                break

        print(radius)

    print(radius)

novodia2(.5)

```
Exemplo de saída (houve um erro no último) :
Captura de tela 2024-06-23 145359.png

Pensei em while aninhados mas não consegui manejá-los.

Reply all
Reply to author
Forward
0 new messages