![]() |
Ситуация такая: Стол казино, на нем выпадает некая последовательность, выдаваемая павновским рандомом (известная функция). Этот рандом независим ни от чего другого. То есть последовательность выдаваемых чисел на столе 100% принадлежит только этому столу.
Проблема в том, что между выпадениями производится некоторое количество вызовов рандома впустую. У меня явно не хватает теоретических математических знаний Вопрос: Как возможно найти эту последовательность и вычислить случайное количество пропусков? Сейчас я написал скрипт, который использует базу из 300 выпавших на одном столе подряд значений. Проблема скрипта в том, что я вручную указываю максимальное количество пропусков между двумя числами. На данный момент при максимальном значении пропусков = 100 у меня находится одна единственная последовательность. Но нет гарантии, что максимум пропусков не могло быть больше 100. Повторюсь, число пропусков неизвестно. А еще прикол в том, что как только база выпавших значений становится достаточно большой, скрипт перестает находить хотя бы одно совпадение. Делаем вывод, что использовано неверное максимальное число пропусков. Увеличиваю число и моментально находятся десятки возможных вариантов. Это, по моему, бесконечный (на практитке. В теории-то, конечный) цикл. Сам сакрипт, если кому интересно: [CODE] #include #include #include //https://github.com/pawn-lang/compiler/blob/master/source/amx/amxcore.c #define INITIAL_SEED 0xcaa938dbL static unsigned long IL_StandardRandom_seed = INITIAL_SEED ; /* always use a non-zero seed */ #define IL_RMULT 1103515245L static long random ( ) { unsigned long lo , hi , ll , lh , hh , hl ; unsigned long result ; lo = IL_StandardRandom_seed & 0xffff ; hi = IL_StandardRandom_seed >> 16 ; IL_StandardRandom_seed = IL_StandardRandom_seed * IL_RMULT + 12345 ; ll = lo * ( IL_RMULT & 0xffff ) ; lh = lo * ( IL_RMULT >> 16 ) ; hl = hi * ( IL_RMULT & 0xffff ) ; hh = hi * ( IL_RMULT >> 16 ) ; result = ( ( ll + 12345 ) >> 16 ) + lh + hl + ( hh minskips ) { if ( pointer == 0 ) seed = IL_StandardRandom_seed ; skipsarr [ pointer ] = skips ; pointer ++ ; skips = 0 ; } skips ++ ; if ( skips > maxskips ) { pointer = 0 ; skips = 0 ; } } printf ( "Found skips. Seed: %u\n" , seed ) ; IL_StandardRandom_seed = seed ; for ( int x = 0 ; x |
| Время: 13:59 |