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) :
Pensei em while aninhados mas não consegui manejá-los.