Python 3.8.0のリストをセットに変換すると、結果のセットの順序*は非常に簡単な方法で高度に構造化されます。この構造は、疑似ランダムリストからどのように抽出されていますか?
私が実行している実験の一部として、ランダムセットを生成しています。セットをプロットすると、セット内に予期しない線形構造が突然現れたことに驚きました。だから私を困惑させる2つのことがある-なぜセット結果への変換がこの構造を強調することになる結局*を持っているのか。そして、それほどではありませんが、なぜ疑似ランダムセットがこの「隠された」構造を持っているのですか?
コード:
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}
上記のリストのプロット**は、予想どおりかなりランダムに見えます。
一方、(出力で順序付けられている)セットをプロットすると、セットに存在する構造が表示されます。
この動作は、上記のコードで使用されている値250および30で、私のマシン(以下の例)で100%一貫しています(使用した例はチェリーピックではありません-実行した最後のものです)。これらの値を調整すると、構造がわずかに異なる場合があります(たとえば、2つではなく3つの算術数列***のサブセット)。
これは他の人のマシンで再現可能ですか?もちろん、そのような構造が存在することは、それほど大きくない疑似乱数の生成を示しているようですが、これは、セットへの変換がこの構造をある意味で「抽出」する方法を説明していません。私が知る限り、セットの順序付け(リストから変換された場合)が確定的であることを正式に保証するものではありません(そうであっても、バックグラウンドで洗練された順序付けは行われません)。それで、これはどのように起こっていますか?
(*):私が知っている、セットは順不同のコレクションですが、私は呼び出すときに、という意味で「注文」を意味するprint声明を、セットがで出力され、いくつかの一貫基本となるセット構造を強調ため。
(**):これらのプロットはWolfram Alphaからのものです。さらに2つの例を以下に示します。
(***):乱数の範囲を250から500に変更した場合の2つのプロット:




