Как найти начальное число генератора случайных чисел?

Я использую следующие строки кода для заполнения записей l_new из l.

import random

l = [11.1, 22.2, 33.3, 11.1, 33.3, 33.3, 22.2, 55.5]

l_new = random.choices(l, k=30)
print(l_new)

Я всегда мог генерировать конкретное l_new, исправляя семя, используя

random.seed(1)
l_new = random.choices(l, k=30)

Теперь я хотел бы знать, можно ли найти seed для заданного l_new, если начальное число не зафиксировано до генерации l_new.

РЕДАКТИРОВАТЬ:

Из того, что было предложено ниже, я могу сделать

import sys
import random
l = [11.1, 22.2, 33.3, 11.1, 33.3, 33.3, 22.2, 55.5]

for i in range(10):
    seed = random.randrange(sys.maxsize)
    print("Seed:", seed)
    random.seed(seed)
    l_new = random.choices(l, k=30)
    print(l_new)

and save `seed` to retrieve the required `l_new` later on?

person Natasha    schedule 12.10.2020    source источник
comment
Отвечает ли это на ваш вопрос? как запросить начальное число, используемое random.random()?   -  person Green Cloak Guy    schedule 12.10.2020
comment
@GreenCloakGuy Не могли бы вы взглянуть на мою правку?   -  person Natasha    schedule 12.10.2020
comment
Зачем тебе семя? Он просто используется для установки внутреннего состояния вашей случайной генерации? Ниже описано, как зафиксировать это состояние.   -  person Patrick Artner    schedule 12.10.2020


Ответы (2)


Невозможно возможно получить начальное число из определенной последовательности случайных чисел. Посмотрите ниже, насколько велико внутреннее состояние вихря Мерсенна.

Теоретически у вас может быть два разных начальных числа, которые производят первые 10 чисел одинаково, а затем отклоняются - чем больше чисел вы рисуете, тем меньше вероятность, что это возможно, но вероятность не равна 0, поэтому обратное невозможно.

Если вы не установите семя, оно будет использовать семя, созданное из даты и времени:

random.seed(a=None, версия =2)

Инициализируйте генератор случайных чисел.

Если a опущен или None, текущее системное время используется [...]

seed() — это просто способ установить внутреннее начальное состояние твистера Мерсенна, который создает случайные числа.

Однако: вы можете получить это состояние, сохранить его и сбросить:

import random

random.seed(42)

numbers = [random.randint(2,22) for _ in range(15)] 
print(numbers) # now you have another interal state 

d = random.getstate()
numbers = [random.randint(2,22) for _ in range(15)] 
print(numbers) # after drawing more numbers you now have another interal state 

# go back to the last state
random.setstate(d)
numbers = [random.randint(2,22) for _ in range(15)] 
print(numbers) # you now draw the same exact numbers 

Вывод:

# first numbers, using system time of 1st use as seed
[22, 5, 2, 10, 9, 9, 6, 5, 19, 4, 20, 15, 3, 2, 4]
# we remebered state and create another 15
[8, 9, 18, 21, 2, 19, 8, 22, 19, 15, 9, 16, 20, 10, 2]
# we reset state to last and create the same 15 again
[8, 9, 18, 21, 2, 19, 8, 22, 19, 15, 9, 16, 20, 10, 2]

Какой тип случайного метода вы используете, повлияет на изменения внутреннего состояния.


На всякий случай, если вам интересно, как выглядит состояние random.seed(42) для меня:

(3, (2147483648, 3564348608, 1266698288, 4212342371, 3595291661, 3180588708, 
     3037210256, 946923017, 2565409715, 2900535780, 924383152, 4180157270, 4230508198,
     2039675917, 3755350407, 2362848650, 2818100609, 2097423432, 524478045, 
     540883378, 281170210, 1485176884, 1493190386, 1773214509, 380915208, 3667698522, 
     2648371337, 2961234806, 3857480267, 1582950522, 246289694, 3322185604, 
     1944574775, 302623699, 169865066, 1143540808, 3733177770, 513116636, 1411153081,
     3205493053, 768926902, 549624109, 1470655403, 59539609, 3678480009, 3087139671, 
     1176835859, 2078491503, 2299934332, 1592059249, 1062716176, 2654193596, 
     3531838733, 2661260596, 3881209635, 2106865768, 4154287292, 2082185616, 
     2301197011, 2177349827, 3082181756, 1787663536, 3714670796, 3018262113, 
     1670056238, 1856738750, 99824592, 2279837081, 1414647942, 3416675731, 3458782472, 
     3997022236, 468762002, 2666158583, 953353270, 1788980658, 3802061067, 407586584, 
     1844776834, 1906917274, 3154715663, 3028370222, 4156024188, 3996363428, 80495456,
     2659800972, 2005649973, 3818358673, 3952623596, 2506862371, 3282302532, 263923435,
     3384662671, 3292439172, 3119957588, 1224426111, 899864150, 215262826, 1619647231,
     3347694949, 3497868538, 2029552053, 2992804824, 4080010250, 2023513186, 1885979437, 
     3564622190, 3775424270, 2297810139, 3549449169, 2664856277, 3274801974, 2794883969,
     980412666, 2980215653, 2794389321, 2816521934, 1266970739, 542306338, 3646225311, 
     3598997630, 2111980720, 2949252482, 2489027658, 352815024, 11610683, 1386663624,
     2004196796, 1161461546, 1921293780, 2463949525, 1647009713, 3550093655, 2563894064,
     3486310554, 1506105865, 243092931, 2659437476, 4200687059, 2284345122, 1974438610,
     3591096528, 967119212, 3362401375, 140678365, 311602112, 2361740275, 2139598582,
     3632873481, 2762232439, 4156482318, 381637792, 3253346525, 2492118775, 1502434558,
     3164497290, 3550998357, 2412448305, 2223955385, 4122879535, 350121793, 1835149778,
     2175117867, 989674750, 3178241202, 3553093569, 3470650311, 2829698151, 3209427769,
     1779174943, 275388428, 4044574515, 715447260, 3180940440, 4020772289, 1322708567, 
     3189868792, 4250485633, 716970023, 2307550151, 1074996711, 1217573599, 197006094,
     2178394212, 1255233746, 4164251484, 1405608772, 2808160475, 1304736088, 1796071066,
     2761748078, 3570739698, 1616118556, 2232868135, 3567541936, 3470600401, 3031621994,
     3351764214, 1359785149, 2617497797, 3340028190, 356162828, 2083806068, 2503635608, 
     4024838996, 2577080371, 2897993505, 3120733934, 905794891, 2506078507, 4211618666, 
     3777871979, 809751414, 4080874167, 1562977008, 3917373055, 2132779194, 4014249473, 
     4067327082, 2582869847, 1780081876, 1842619106, 3381761227, 921004274, 1393256920,
     1883566732, 2702071861, 865327389, 1622085203, 3021825820, 2687061406, 1748902923,
     689023977, 308399650, 2377287978, 1646969411, 1051806316, 4277884230, 2041056290, 
     101134519, 2032472116, 4112521069, 151202901, 2773743461, 551348559, 3476836808,
     510935951, 625057077, 3757450756, 2977698135, 3027776859, 2616998041, 2773430005, 
     544190486, 2241368212, 1141105829, 1452816309, 4199229235, 3218013033, 4229475816, 
     1659576351, 3020348754, 1193400518, 3208584597, 1151197733, 2597187966, 503065140,
     2421841572, 1437291709, 1909275895, 2872630545, 793588217, 3792934707, 1784451785, 
     2921385648, 1669902526, 4189978976, 1196986251, 434805516, 1907541826, 2624415034, 
     1687778718, 650746582, 1949153382, 4148493093, 841300520, 1164202054, 4203468658, 
     4106300911, 850346789, 1715730760, 3114661489, 2866524548, 1360448945, 3601318775,
     1743078223, 2413855408, 1211895622, 325117146, 2721152875, 1284334485, 2446538832, 
     739014618, 2237045115, 842553465, 2538598293, 746460793, 4010387366, 2002655192, 
     4193733112, 1194380773, 3918217378, 1447487475, 5659228, 3408847694, 4190318700, 
     1862549564, 781683719, 1194618118, 755053413, 3436011942, 2885435303, 3081151348,
     2017642831, 1053816502, 1086627485, 2157296554, 110650022, 965352898, 1003174194,
     1288956241, 4057404871, 2965068465, 2897064481, 2457377317, 1879872545, 358455290, 
     375086701, 3015902095, 1676249984, 924455526, 2084169389, 1989014644, 1993749926, 
     2009424973, 2113340508, 3980883273, 2915977458, 203328382, 3020815229, 2415050113,
     4103009585, 3700885489, 2916647550, 1523006503, 174302338, 2476909338, 1969322490,
     4285741984, 1528449097, 3355315515, 4217241278, 599579127, 2572243673, 3035856735, 
     1539140489, 1782314913, 4238644287, 1746424142, 1978148312, 2380746849, 184941882, 
     1106717981, 1720750349, 981701307, 3953154731, 3257809181, 2892339376, 3339778166, 
     3676936849, 87425948, 3029257381, 2037942523, 3807628706, 2861474706, 1058852346, 
     1322765211, 2686046342, 2689342655, 2303436168, 2571627181, 1986057734, 1183564308,
     2829677523, 1295563975, 503126586, 2025890348, 4179277821, 1735262467, 981331774, 
     1613447066, 1011606109, 2000062246, 3581448390, 3477731384, 3641307373, 3508544379,
     2327233491, 3931944343, 4189052882, 2990416380, 422406169, 202291313, 2531006461, 
     4277024116, 3815144003, 821314585, 1344175168, 3562834071, 1339615445, 1831545190,
     3115548822, 743512780, 4006999448, 3720181735, 1012033521, 919931041, 2628967879, 
     1151876565, 1268107129, 3674829936, 834977846, 743987006, 3947536548, 3706529695, 
     4121073678, 2507605742, 1595636918, 2708047833, 2427507331, 3868216331, 3254240010,
     2097683411, 3279710596, 3686819053, 1843541720, 1683793619, 3245287285, 3571828776, 
     3733296431, 3806747478, 1390930605, 3860422228, 114397037, 1931519825, 2770684378, 
     1556101783, 1436111731, 4031950081, 562876656, 1775895782, 612364620, 1313509772, 
     4283410242, 3252958463, 2176555836, 3933073367, 3013277102, 1444071961, 3120949516, 
     2824578890, 325676929, 943677134, 1800649256, 1721927060, 347498719, 1435221321, 
     2623572981, 1408548470, 4145586315, 2901889237, 1849377952, 1239144551, 3382598266,
     2992893897, 3738297588, 611280106, 3897415338, 2370299241, 1772308583, 3697465753, 
     354508058, 2702360134, 591308331, 3524072501, 976616000, 2563717192, 3078266097, 
     1376594703, 4209795919, 2454412767, 2712206031, 2963860163, 3734324882, 2248653800, 
     324872786, 3789837448, 3779000146, 527733939, 2844165793, 576499681, 1618787435, 
     2638888650, 57511068, 2804627518, 2993670030, 481402236, 2810124845, 1416045214, 
     1723694191, 1214944572, 3188123783, 1139185907, 3851015362, 1719652470, 1661343029, 
     3644307578, 3564178709, 1256656955, 46631590, 4231317929, 3098958589, 1834956625, 
     2206185428, 3695688374, 3647957317, 1064098871, 1739100906, 2579568980, 27974051,
     2617466775, 964075233, 907049942, 4164146575, 3377168066, 2524828266, 1083546008,
     2992960953, 2260789066, 1543742095, 2843842831, 1375722284, 3574521313, 110842534, 
     2310998251, 3076511734, 783145600, 1287776608, 3087144146, 305559823, 2356293719, 
     3228441476, 1678938122, 3775814061, 1620283952, 2512027726, 1031432407, 962295099, 
     3877418501, 968669928, 304126693, 3711291137, 3847527101, 494066767, 4050229756, 
     4169448589, 671763915, 1095747781, 4006132710, 394725957, 200521654, 2715998750, 
     1477567673, 895171901, 3370105999, 2684157455, 4153990023, 3966076501, 2043374409, 
     144443759, 6764556, 1611650045, 1480956755, 1388276468, 4136518438, 1538041336, 
     266773992, 1623357516, 2267298390, 3183919402, 1084292424, 2796136160, 2413448816,
     2850375199, 3510894040, 2644778623, 3317288284, 3697317540, 1465776787, 1843489446,
     1416711171, 744701117, 1286781349, 3748640476, 861982119, 2377742909, 1171768136, 
     2701877439, 3839724288, 2869791015, 2386067954, 2629214347, 955801623, 3831079317,
     624),
 None)
  
person Patrick Artner    schedule 12.10.2020
comment
Обычно можно определить состояние ГСЧ по достаточно длинной последовательности случайных чисел. Существует только конечное число возможных состояний, и для достаточно длинного вывода обычно существует только одно возможное состояние, которое могло бы дать этот вывод. Однако достаточно долго может быть довольно долго, особенно для Mersenne Twister, в котором используется гигантское состояние, далеко за пределами возможности предоставления какой-либо практической пользы. - person user2357112 supports Monica; 12.10.2020
comment
Большое спасибо за ответ, не могли бы вы уточнить, будет ли random.setstate(d) генерировать [8, 9, 18, 21, 2, 19, 8, 22, 19, 15, 9, 16, 20, 10, 2] всякий раз, когда код запускается, или он будет меняться в зависимости от sys времени? - person Natasha; 12.10.2020
comment
@Наташа, состояние, которое вы собираете случайным образом, определяет его внутреннее состояние. Если вы выберете из него какой-либо случайный элемент, это состояние изменится. Пока вы используете одни и те же случайные операции, состояние изменяется одинаково, поэтому вы создаете тот же порядок случайных чисел. - person Patrick Artner; 12.10.2020
comment
@a_guest: Это великолепно. Даже криптографические ГСЧ не используют столько состояний. Управление всем этим состоянием — пустая трата кеша, а статистические свойства Mersenne Twister даже не лучше, чем у конкурентов с состояниями на два порядка меньше. - person user2357112 supports Monica; 12.10.2020

Это невозможно из-за того, что вывод random ГСЧ получает сопоставляется через floor, и эта связь не является внедрением:

return [population[floor(random() * n)] for i in _repeat(None, k)]

Таким образом, даже если вы знаете, какие элементы были выбраны из исходного списка l, вы не можете сказать, какой вывод произвел random, и, следовательно, вы не можете вывести внутреннее состояние ГСЧ.

person a_guest    schedule 12.10.2020