Lorsque je convertis une liste Python 3.8.0 en un ensemble, l'ordre des ensembles résultant * est hautement structuré de manière non triviale. Comment cette structure est-elle extraite de la liste pseudo-aléatoire?
Dans le cadre d'une expérience que je lance, je génère un ensemble aléatoire. J'ai été surpris de voir que le tracé de l'ensemble montrait soudainement une structure linéaire inattendue dans l'ensemble. Il y a donc deux choses qui m'intriguent - pourquoi la conversion en résultat d'ensemble a-t-elle un ordre * qui finit par mettre en évidence cette structure; et, dans une moindre mesure, pourquoi l'ensemble pseudo-aléatoire a-t-il cette structure "cachée"?
Le code:
X = [randrange(250) for i in range(30)]
print(X)
print(set(X))
qui sort, par exemple
[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 tracé ** de la liste ci-dessus semble assez aléatoire, comme prévu:
tandis que le traçage de l'ensemble (tel qu'il est ordonné dans la sortie) présente la structure présente dans l'ensemble:
Ce comportement 100% cohérent sur ma machine (plus d'exemples ci-dessous) avec les valeurs 250 et 30 utilisées dans le code ci-dessus (l'exemple que j'ai utilisé n'est pas choisi par les cerises - c'est juste le dernier que j'ai exécuté). Le réglage de ces valeurs entraîne parfois une structure légèrement différente (par exemple, un sous-ensemble de trois progressions arithmétiques *** au lieu de deux).
Est-ce reproductible sur les machines d'autres personnes? Bien sûr, le fait qu'une telle structure existe semble indiquer une génération de nombres pseudo-aléatoires pas si grande, mais cela n'explique pas comment la conversion en un ensemble «extrait» en quelque sorte cette structure. Pour autant que je sache, il n'y a aucune garantie formelle que l'ordre d'un ensemble (lorsqu'il est converti à partir d'une liste) est déterministe (et même s'il l'est, aucun ordre sophistiqué n'est effectué en arrière-plan). Alors comment ça se passe?!
(*): Je sais, les ensembles sont des collections non ordonnées, mais je veux dire "ordonné" dans le sens où, lors de l'appel de l' print
instruction, l'ensemble est sorti dans un ordre qui met en évidence de manière cohérente la structure d'ensemble sous-jacente.
(**): Ces parcelles proviennent de Wolfram Alpha. Voici deux autres exemples:
(***): Deux tracés lors du changement de la plage des nombres aléatoires de 250 à 500: