Когда я преобразую список Python 3.8.0 в набор, результирующее упорядочение набора * очень структурировано нетривиальным способом. Как эта структура извлекается из псевдослучайного списка?
В рамках эксперимента, который я провожу, я генерирую случайный набор. Я был удивлен, увидев, что построение сюжета неожиданно показало неожиданную линейную структуру в наборе. Так что меня озадачивают две вещи: почему преобразование в заданный результат имеет порядок *, который в конечном итоге выделяет эту структуру; и, в меньшей степени, почему псевдослучайное множество вообще имеет эту «скрытую» структуру?
Код:
X = [randrange(250) for i in range(30)]
print(X)
print(set(X))
какие выводы, например
[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}
График ** из приведенного выше списка выглядит довольно случайным, как и ожидалось:
тогда как построение графика набора (как это упорядочено в выводе) показывает структуру, присутствующую в наборе:
Такое поведение на моей машине на 100% соответствует (больше примеров ниже) со значениями 250 и 30, использованными в приведенном выше коде (пример, который я использовал, не был выбран вишней - это только последний, который я запустил). Настройка этих значений иногда приводит к несколько иной структуре (например, подмножество трех арифметических прогрессий *** вместо двух).
Это воспроизводимо на машинах других людей? Конечно, такая структура существует, кажется, свидетельствует о не очень большой генерации псевдослучайных чисел, но это не объясняет, как преобразование в набор в некотором смысле «извлечет» эту структуру. Насколько мне известно, нет формальной гарантии того, что упорядочение набора (при преобразовании из списка) является детерминированным (и даже если это так, в фоновом режиме не выполняется сложное упорядочение). Так как же это происходит ?!
(*): Я знаю, что наборы являются неупорядоченными коллекциями, но я имею в виду «упорядоченный» в том смысле, что при вызове print
оператора набор выводится в некотором порядке, который последовательно выделяет базовую структуру набора.
(**): Эти сюжеты взяты из Wolfram Alpha. Еще два примера ниже:
(***): два графика при изменении диапазона случайных чисел с 250 на 500: