Kiedy konwertuję listę Python 3.8.0 na zestaw, wynikowa kolejność zestawów * jest wysoce uporządkowana w nietrywialny sposób. Jak ta struktura jest wydobywana z listy pseudolosowej?
W ramach prowadzonego eksperymentu generuję losowy zestaw. Byłem zaskoczony widząc, że kreślenie zestawu nagle pokazało nieoczekiwaną strukturę liniową w zestawie. Zastanawiają mnie więc dwie rzeczy - dlaczego konwersja na zestaw wyników ma uporządkowanie *, co w końcu uwypukla tę strukturę; i, w mniejszym stopniu, dlaczego zestaw pseudolosowy ma w ogóle tę „ukrytą” strukturę?
Kod:
X = [randrange(250) for i in range(30)]
print(X)
print(set(X))
które wyjścia, na przykład
[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}
Wykres ** z powyższej listy wygląda dość losowo, zgodnie z oczekiwaniami:
podczas gdy wykreślanie zestawu (zgodnie z kolejnością na wyjściu) wykazuje strukturę obecną w zestawie:
To zachowanie jest w 100% spójne na mojej maszynie (więcej przykładów poniżej) z wartościami 250 i 30 użytymi w powyższym kodzie (przykład, którego użyłem, nie został wybrany - to tylko ostatni, który uruchomiłem). Strojenie tych wartości czasami powoduje nieco inną strukturę (np. Podzbiór trzech progresji arytmetycznych *** zamiast dwóch).
Czy jest to powtarzalne na maszynach innych ludzi? Oczywiście, że taka struktura istnieje, wydaje się wskazywać na niezbyt wielkie generowanie liczb pseudolosowych, ale to nie wyjaśnia, w jaki sposób konwersja na zbiór w pewnym sensie „wydobywałaby” tę strukturę. O ile mi wiadomo, nie ma formalnej gwarancji, że uporządkowanie zestawu (po przekonwertowaniu z listy) jest deterministyczne (a nawet jeśli tak jest, nie jest wykonywane wyrafinowane porządkowanie w tle). Jak to się dzieje ?!
(*): Wiem, że zbiory są nieuporządkowanymi zbiorami, ale mam na myśli „uporządkowany” w tym sensie, że podczas wywoływania print
instrukcji zestaw jest wyprowadzany w pewnej kolejności, która konsekwentnie podkreśla podstawową strukturę zbioru.
(**): Te wykresy pochodzą z Wolfram Alpha. Dwa kolejne przykłady są poniżej:
(***): Dwa wykresy przy zmianie zakresu liczb losowych z 250 na 500: