Quando converto un elenco Python 3.8.0 in un set, l'ordinamento del set risultante * è altamente strutturato in modo non banale. Come viene estratta questa struttura dall'elenco pseudo-casuale?
Come parte di un esperimento che sto eseguendo, sto generando un set casuale. Sono stato sorpreso di vedere che la trama del set improvvisamente ha mostrato una struttura lineare inaspettata nel set. Quindi ci sono due cose che mi sconcertano: perché la conversione in un risultato impostato ha un ordinamento * che finisce per evidenziare questa struttura; e, in misura minore, perché l'insieme pseudo-casuale ha questa struttura "nascosta"?
Il codice:
X = [randrange(250) for i in range(30)]
print(X)
print(set(X))
quali uscite, ad esempio
[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}
Un grafico ** dell'elenco sopra sembra abbastanza casuale, come previsto:
mentre la trama dell'insieme (come ordinato nell'output) mostra la struttura presente nell'insieme:
Questo comportamento è coerente al 100% sulla mia macchina (più esempi di seguito) con i valori 250 e 30 utilizzati nel codice sopra (l'esempio che ho usato non è stato scelto da ciliegia - è solo l'ultimo che ho eseguito). L'ottimizzazione di questi valori talvolta comporta una struttura leggermente diversa (ad esempio un sottoinsieme di tre progressioni aritmetiche *** anziché due).
È riproducibile su macchine di altre persone? Ovviamente, che tale struttura esista sembra indicativa di una generazione di numeri pseudo-casuali non così grande, ma ciò non spiega come la conversione in un insieme "estrarrà" in qualche modo questa struttura. Per quanto ne so, non esiste alcuna garanzia formale che l'ordinamento di un set (quando convertito da un elenco) sia deterministico (e anche se lo è, non esiste un ordinamento sofisticato in background). Allora, come sta succedendo questo ?!
(*): Lo so, gli insiemi sono raccolte non ordinate, ma intendo "ordinato", nel senso che, quando si chiama l' printistruzione, l'insieme viene emesso in un ordine che evidenzia in modo coerente la struttura dell'insieme sottostante.
(**): queste trame provengono da Wolfram Alpha. Altri due esempi sono di seguito:
(***): due grafici quando si cambia l'intervallo dei numeri casuali da 250 a 500:




