Quando converto uma lista Python 3.8.0 em um conjunto, a ordenação resultante * é altamente estruturada de maneira não trivial. Como essa estrutura está sendo extraída da lista pseudo-aleatória?
Como parte de um experimento que estou executando, estou gerando um conjunto aleatório. Fiquei surpreso ao ver que a plotagem do conjunto de repente mostrou uma estrutura linear inesperada no conjunto. Portanto, há duas coisas que me intrigam: por que a conversão para um resultado definido tem uma ordem * que acaba destacando essa estrutura; e, em menor grau, por que o conjunto pseudo-aleatório tem essa estrutura "oculta"?
O código:
X = [randrange(250) for i in range(30)]
print(X)
print(set(X))
quais saídas, por exemplo
[238, 202, 245, 94, 111, 106, 148, 164, 154, 113, 128, 10, 196, 141, 69, 38, 106, 8, 40, 53, 160, 87, 85, 13, 38, 147, 204, 50, 162, 91]
{128, 8, 10, 141, 13, 147, 148, 154, 160, 162, 164, 38, 40, 50, 53, 196, 69, 202, 204, 85, 87, 91, 94, 106, 238, 111, 113, 245}
Um gráfico ** da lista acima parece bastante aleatório, como esperado:
enquanto a plotagem do conjunto (conforme ordenada na saída) exibe a estrutura presente no conjunto:
Esse comportamento é 100% consistente na minha máquina (mais exemplos abaixo) com os valores 250 e 30 usados no código acima (o exemplo que eu usei não é escolhido por cereja - é apenas o último que eu executei). O ajuste desses valores às vezes resulta em uma estrutura ligeiramente diferente (por exemplo, um subconjunto de três progressões aritméticas *** em vez de duas).
Isso é reproduzível nas máquinas de outras pessoas? É claro que essa estrutura existe parece indicativa de uma geração de números pseudoaleatórios não tão boa, mas isso não explica como a conversão em um conjunto "de certa forma" extrairia essa estrutura. Tanto quanto sei, não há garantia formal de que a ordem de um conjunto (quando convertida de uma lista) seja determinística (e mesmo que seja, não há nenhuma ordem sofisticada sendo executada em segundo plano). Então, como isso está acontecendo ?!
(*): Eu sei que conjuntos são coleções não ordenadas, mas quero dizer "ordenados" no sentido de que, ao chamar a print
declaração, o conjunto é produzido em alguma ordem que destaca consistentemente a estrutura subjacente dos conjuntos.
(**): esses gráficos são da Wolfram Alpha. Mais dois exemplos estão abaixo:
(***): dois gráficos ao alterar o intervalo dos números aleatórios de 250 para 500: