Bir Python 3.8.0 listesini bir kümeye dönüştürdüğümde, ortaya çıkan küme sırası * önemsiz olmayan bir şekilde son derece yapılandırılmıştır. Bu yapı yalancı rasgele listeden nasıl çıkarılıyor?
Çalıştığım bir deneyin parçası olarak rastgele bir set oluşturuyorum. Seti çizmenin birdenbire sette beklenmedik doğrusal yapı gösterdiğini görünce şaşırdım. Bu yüzden beni şaşırtan iki şey var - neden belirli bir sonuca dönüştürmenin bu yapıyı vurgulayan bir sıralaması * var; ve daha az bir ölçüde sahte rastgele kümenin neden bu "gizli" yapıya sahip olduğu?
Kod:
X = [randrange(250) for i in range(30)]
print(X)
print(set(X))
hangi çıktılar, örneğin
[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}
Yukarıdaki listenin bir grafiği ** beklendiği gibi oldukça rastgele görünüyor:
buna karşılık kümenin çizilmesi (çıktıda sıralandığı gibi) kümede bulunan yapıyı gösterir:
Bu davranış, yukarıdaki kodda kullanılan 250 ve 30 değerleri ile makinemde% 100 tutarlı (daha fazla örnek) (kullandığım örnek kiraz toplanmış değil - sadece son koştuğum). Bu değerlerin ayarlanması bazen biraz farklı bir yapıya neden olabilir (örneğin, iki yerine üç aritmetik ilerlemenin alt kümesi ***).
Bu diğer insanların makinelerinde tekrarlanabilir mi? Tabii ki, bu tür bir yapı var, o kadar da büyük olmayan bir sahte rastgele sayı üretiminin göstergesi gibi görünüyor, ancak bu, bir kümeye dönüştürmenin bir anlamda bu yapıyı nasıl 'ayıklayacağını' açıklamıyor. Bildiğim kadarıyla, bir setin (bir listeden dönüştürüldüğünde) siparişinin belirleyici olduğuna dair resmi bir garanti yoktur (ve öyle olsa bile, arka planda karmaşık bir sipariş yapılmaz). Peki bu nasıl oluyor ?!
(*): Biliyorum, setleri sırasız koleksiyonları vardır, ama demek çağrılırken, anlamında "sipariş" printdeyimi, seti de çıkışı bazı tutarlı yatan set yapısını vurgular sırayla.
(**): Bu araziler Wolfram Alpha'dan. İki örnek daha aşağıdadır:
(***): Rastgele sayıların aralığını 250'den 500'e değiştirirken iki çizim:




