Другое Как обыграть казино?

papercut

Известный
125
24
Ух какая классная тема. Ребята, я в этом шарю.
...
На тринити, как и на других серверах, random() из amxcore вызывается один и тот же, поэтому единственный вариант угадать что будет на рулетке - быть на сервере одному, чтобы никто не работал на работах, не крутил фишки и не писать /try.
Так я и сделал. Зашел, когда на сервере никого не было.
Проще это сделать перебором. Для этого скриптом записал числа ,которые случайно показываются вверху экрана, когда на рулетке крутится шарик. Там 0-36. Для этого разброса достаточно 7 чисел подряд для синхронизации локального радома с серверным рандомом. Вписываю в скрипт последние 7 чисел сверху и через 30 секунд получаю ответ - число, которое в итоге и выпало на рулетке на сервере. Синхронизировался. Делаю 170 (вроде) прокрутов - количество чисел, которые показываются сверху, получаю "предсказанное" число. И.... Оно не совпадает.
Делаю ставку, записываю числа сверху. Делаю сразу же вторую ставку, опять записываю числа. Между ставками где-то 30 или 25 сек. В скрипт вписываю санчала 7 чисел из первой прокрутки, потом 7 чисел из второй. Скрипт сначала сонхронизируется с первым результатом, потом начинает прокручивать рандом, пока не сонхронизируется со вторым набором чисел. И попутно считает, сколько прокрутов рандома понадобилось для нахождения второй последовательности. Кажется, что ответ должен быть +- количество прокрутов. Может +1 или -1 от этого числа, мелочи. Нет, по факту результат получается
image.png
А это значит, что на сервере всегда крутится какой-то рандом. Видимо, в паблике онсервертик или типа того. А это, в свою очередь, значит, что в зависимости от загрузки сервера количество прокрутов будет разным. За 25 секунд прошло примерно 1400 прокрутов, значит примерно 56 прокрутов в секунду. Тут элементарно успех зависит от пинга. Выше виден предыдущий результат - почти 3к прокрутов. Это потому что я ждал между ставками чуть больше.
По моему, это невозможно предугадать
 

K1BeR

Участник
Автор темы
18
53
Ух какая классная тема. Ребята, я в этом шарю.
...
На тринити, как и на других серверах, random() из amxcore вызывается один и тот же, поэтому единственный вариант угадать что будет на рулетке - быть на сервере одному, чтобы никто не работал на работах, не крутил фишки и не писать /try.
Так я и сделал. Зашел, когда на сервере никого не было.
Проще это сделать перебором. Для этого скриптом записал числа ,которые случайно показываются вверху экрана, когда на рулетке крутится шарик. Там 0-36. Для этого разброса достаточно 7 чисел подряд для синхронизации локального радома с серверным рандомом. Вписываю в скрипт последние 7 чисел сверху и через 30 секунд получаю ответ - число, которое в итоге и выпало на рулетке на сервере. Синхронизировался. Делаю 170 (вроде) прокрутов - количество чисел, которые показываются сверху, получаю "предсказанное" число. И.... Оно не совпадает.
Делаю ставку, записываю числа сверху. Делаю сразу же вторую ставку, опять записываю числа. Между ставками где-то 30 или 25 сек. В скрипт вписываю санчала 7 чисел из первой прокрутки, потом 7 чисел из второй. Скрипт сначала сонхронизируется с первым результатом, потом начинает прокручивать рандом, пока не сонхронизируется со вторым набором чисел. И попутно считает, сколько прокрутов рандома понадобилось для нахождения второй последовательности. Кажется, что ответ должен быть +- количество прокрутов. Может +1 или -1 от этого числа, мелочи. Нет, по факту результат получается
image.png
А это значит, что на сервере всегда крутится какой-то рандом. Видимо, в паблике онсервертик или типа того. А это, в свою очередь, значит, что в зависимости от загрузки сервера количество прокрутов будет разным. За 25 секунд прошло примерно 1400 прокрутов, значит примерно 56 прокрутов в секунду. Тут элементарно успех зависит от пинга. Выше виден предыдущий результат - почти 3к прокрутов. Это потому что я ждал между ставками чуть больше.
По моему, это невозможно предугадать
Очень интересно. Думаю, время покажет
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,746
4,831
Очень интересно. Думаю, время покажет
Время и показало. AMX на старте инициализирует свой сид для рандома исходя из времени. А тут это не учтено, и видимо вообще не думали об этом. Конечно же куски последовательности могут накладываться, но не вся последовательность. А еще это работает только в санитарных условиях, и только если мы знаем что на сервере юзается стандартный рандом.

Если брать аризону - там выигрыш в казино зависит буквально от фазы луны, если учитывать что ГСПЧ выдает нормальное распределение
 

papercut

Известный
125
24
Время и показало. AMX на старте инициализирует свой сид для рандома исходя из времени. А тут это не учтено, и видимо вообще не думали об этом. Конечно же куски последовательности могут накладываться, но не вся последовательность. А еще это работает только в санитарных условиях, и только если мы знаем что на сервере юзается стандартный рандом.

Если брать аризону - там выигрыш в казино зависит буквально от фазы луны, если учитывать что ГСПЧ выдает нормальное распределение
7 значений подряд выданных известным алгоритмом (линейным конгруэнтым) достаточно чтобы найти в последовательности это место со 100% вероятностью. На тринити именно так, на аризоне - хз, вроде про тринити речь. Вот полный код скрипта, если интересно
C:
#include <limits.h>
#include <stdio.h>
#include <time.h>

#define N 7
//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 << 16);
    result &= ~LONG_MIN;        /* remove sign bit */

    return result;
}

int myrand()
{
    return random() % 37;
}

int main()
{
    printf("Enter 7 numbers:\n");
    // int nums[N]; // 18 / sec
    int nums[N] = { 2, 15, 15, 10, 32, 29,21 };
    // for(int i = 0; i < N; i++)
    // {
    //     scanf("%d", &nums[i]);
    //     printf(" (%d) ", nums[i]);
    // }
    printf("Calculating...\n");
    //IL_StandardRandom_seed = 3209995687;
    //int nums[N] = {33,32,14,1,11,2,36};
    clock_t start;
    start = clock();
    int yes = 0;
    while(yes < N){
        if(myrand() == nums[yes]) yes++;
        else yes = 0;
    }
    printf("Found in %lf secs, seed = %u\n", (double)(clock() - start) / CLOCKS_PER_SEC, IL_StandardRandom_seed);
    while(1)
    {
        printf("Next: %d\n", myrand());
        getchar();
    }
    
    return 0;
}
 

wiren11

Новичок
21
3
Касаемо id хотелось бы добавить видео ринжи, где как раз упоминается что шансы в некоторых системах были связаны с id игрока + в видео фигурирует уже удаленная тема
И без него это понятно. Старая лотерея была завязана на маленьких айди как и нынешняя система у бота на цр
 
  • Вау
Реакции: Top_vlad

zxcultan

Потрачен
837
321
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Вся эта хуйня рушится, когда рандом работает не на стандартном Сишном рандоме (который нигде не используется)
 
  • Нравится
Реакции: kin4stat

fhqme

Новичок
3
0
Пожалуйста, отнеситесь к моей статье серьёзно. Здесь не будет мнимых тактик по «выигрышу» в казино. Только математика и алгоритмы. По началу я рыл интернет в поиске информации, но не нашёл ничего дельного. Именно это и сподвигло меня написать статью. Забегая наперёд скажу, что здесь будет написано о предсказывании псевдослучайной генерации.
Как работает рандом в SA:MP?
У компьютеров нет случайности. Здесь рандом - это алгоритм, основанный на математических операциях. Такой алгоритм называется генератором псевдослучайных чисел. Настоящая случайность существует только в природе, и то это довольно философская тема. То, что сейчас для нас случайность, может стать абсолютно прогнозируемой вещью в будущем. Наверняка вы когда-либо интересовались тем, как же всё-таки работает рандом в попытках обыграть в казино. Может быть, пытались зайти закономерность в последовательнастях выпадающих чисел? К сожалению, я не волшебник и предсказать рандом в казино пока что можно только в теории. Но я считаю, что достаточно близок к этому и в своей статье постараюсь это доказать. Однако, эту статью я пишу не просто так. Мне не хочется больше этим заниматься и я хочу привлечь внимание других людей к этому. Может быть, именно вы создадите первый в мире чит на казино?
Ядро Pawn
Pawn – си-подобный скриптовый язык программирования и бла-бла-бла.
Именно на нём пишутся сервера для нашей любимой игры. Для того, чтобы решить нашу задачу, нужно понять, как это работает изнутри. Обратимся к исходному коду, который, к счастью, был любезно оставлен авторами: тык
Обратите внимание на строку №446: именно здесь начинается нужная нам функция. Это линейный конгруэнтный генератор — один из самый популярных и простых в создании генераторов псевдослучайных чисел. Мы любезно позаимствуем эту фунцию в свой код. На основе этой функции я написал программу, позволяющую удобно генерировать числа. Код ниже:

Генератор:
int main()
{
    int mod;
    cout << "Enter module of number (0 if not): ";
    cin >> mod;
    while (true)
    {
        cin.ignore();
        cout << "Your number is " << noRandom(mod);
    }

    return 0;
}

*Это лишь пример, поэтому если вы бездумно скопируете, скорее всего у вас ничего не получится. В своей статье я буду вставлять только основную часть, а не весь код. Если вам понадобится, вы сможете самостоятельно написать нужную вам программу, потому что я описываю достаточно простые для понимания вещи.
Теория
Каждый линейный генератор псевдослучайных чисел имеет периодичность. Это значит, что через n генераций последовательность начнёт повторяться. В нашем случае это число 2^32. Проверить это можно написав следующий код:
Период:
void main()
{
    for(unsigned long long i = 0; i < RANDOM_PERIOD; i++)
    {
        noRandom();
        if (((i + 1) % 4294967UL) == 0UL)
        {
            cout << "\rProgress: " << int((double)i / (double)RANDOM_PERIOD * 100) << "%" << flush;
        }
    }
    cout << "\rProgress: " << "100% - copmleted" << endl;
    while(true)
    {
        cin.ignore();
        cout << noRandom() << endl;
    }
}
Здесь RANDOM_PERIOD – 2^32.

Вывод:
Посмотреть вложение 180875
Мы видим, что числа совпадают. Это значит, что если знать некоторую последовательность чисел, то возможно определить следующее генерируемое число. Но есть один нюанс.
Практика: Решение в лоб
Я написал функцию, ищущую примерную последовательность среди псевдослучайно сгенерированых чисел. Что значит примерную? Это значит, что между числами в последовательности может быть до n неизвестных чисел. Почему примерную? Помните я говорил о нюансе? Так вот, если искать точную последовательность, то у вас скорее всего ничего не выйдет, потому что помимо вас на сервере множество игроков, вызывающих функцию random своими действиями. Я пытался проверить работу этой программы на реальном сервере с малым количеством игроков, заплатил свои кровные 150 рублей криптону для того, чтобы он соорудил мне плагин для SAMPFUNCS, ибо сам я под самп ничего писать не умею, но, увы, ничего не вышло. То ли я дурак, то ли лыжи не едут. Проще говоря, я потратил на тесты довольно много времени, а выхлопа как не было, так и нет. Зато всё прекрасно работает на сервере с одним игроком. Это я показал в видео - клац. А вот и код:
Поиск:
int optimizedSearch(vector<int> pat, int mod, int k)
{
    int M = pat.size();

    int result = -1;

    if (k > RANDOM_PERIOD - M)
        return result; // k is out of range

    int j, c;
    for (unsigned long i = 0; i < RANDOM_PERIOD - M - c; ++i) {
        c = 0;
        for (j = 0; j < M + c; ++j)
        {
            if (noRandom(mod) != pat[j - c])
            {
                if (j == 0)
                    break;
                ++c;
            }
            if (c > k)
            {
                c = k;
                break;
            }
        }
        if (j == M + c)
        {
            return 1;
        }
    }
    return result;
}
Алгоритм вернёт 1, если последовательность будет найдена и -1, если нет. Если вам вернётся 1, то нужно будет просто вызывать функцию рандома, чтобы получать следующие числа.
Почему в лоб? Есть ли ещё какое-то решение?

Да, скорее всего есть более быстрый алгоритм поиска, основанный на математический вычислениях. Я не стал этим заниматься,потому что, как я писал выше, мне надоело. Возможно, вложившись в его написание у вас получится отыграть все деньги, проигранные в баре? ;)

Что будет дальше?

Надеюсь, люди воспримут меня всерьёз и умельцы смогут сделать настоящий чит для казино. Но, к сожалению, сейчас это возможно только на бумаге.

Огромная благодарность за то, что прочитали мою статью. Надеюсь, она вдохновит вас на подвиги ;) Удачи.
На тринити кста нет никакого рандома, там тупо казик наёбует. Я с другом сегодня поставил 4 раза на 1st, а он на 3rd. По итогу все 4 раза выпало 2nd и мы в минусе
 
  • Bug
Реакции: paulohardy

Sanek Uchixa

Участник
59
11
Смотри береш Никогда не играеш в казино и все готово ты обыграл казино И у тебя дохуя денег За способ 100 рублей на карту)))))
 
  • Bug
Реакции: zxcultan

zxcultan

Потрачен
837
321
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Смотри береш Никогда не играеш в казино и все готово ты обыграл казино И у тебя дохуя денег За способ 100 рублей на карту)))))

  • В конце слова мягкий знак после шипящих ставится:
    В именах существительных женского рода третьего склонения (дочь, мышь, рожь, печь)
    В глаголах в неопределенной форме и оканчивающихся на ЧЬ (стричь, сечь, беречь)
    В глаголах в форме 2 лица единственного числа настоящего и будущего времени (ведешь, ждешь, испечешь, придешь)
 
  • Нравится
Реакции: K1BeR

papercut

Известный
125
24
Вся эта хуйня рушится, когда рандом работает не на стандартном Сишном рандоме (который нигде не используется)

На тринити кста нет никакого рандома, там тупо казик наёбует. Я с другом сегодня поставил 4 раза на 1st, а он на 3rd. По итогу все 4 раза выпало 2nd и мы в минусе
Еще раз говорю, что между двумя выпавшими на рулетке числами рандом "впустую" прокручивается 1500 раз. По тому, что в итоге падает на рулетку судить нельзя. У тебя может выпадать 3 раза подряд 0 и это не будет значить, что это как в теории вероятности 1/37 И 1/37 И 1/37 (шанс около 2 * 10^-5).

Если кому-то хочется проверить это, записывайте скриптом все приходящие сетстринги для текстдрава вверху. Там числа показываются "случайно" (павновским рандомом). Берете 7 подряд показанных через setstring, вставляете в скрипт, который подбирает рандом, и получаете те же числа.
 

lionik1113

Известный
44
54
Пожалуйста, отнеситесь к моей статье серьёзно. Здесь не будет мнимых тактик по «выигрышу» в казино. Только математика и алгоритмы. По началу я рыл интернет в поиске информации, но не нашёл ничего дельного. Именно это и сподвигло меня написать статью. Забегая наперёд скажу, что здесь будет написано о предсказывании псевдослучайной генерации.
Как работает рандом в SA:MP?
У компьютеров нет случайности. Здесь рандом - это алгоритм, основанный на математических операциях. Такой алгоритм называется генератором псевдослучайных чисел. Настоящая случайность существует только в природе, и то это довольно философская тема. То, что сейчас для нас случайность, может стать абсолютно прогнозируемой вещью в будущем. Наверняка вы когда-либо интересовались тем, как же всё-таки работает рандом в попытках обыграть в казино. Может быть, пытались зайти закономерность в последовательнастях выпадающих чисел? К сожалению, я не волшебник и предсказать рандом в казино пока что можно только в теории. Но я считаю, что достаточно близок к этому и в своей статье постараюсь это доказать. Однако, эту статью я пишу не просто так. Мне не хочется больше этим заниматься и я хочу привлечь внимание других людей к этому. Может быть, именно вы создадите первый в мире чит на казино?
Ядро Pawn
Pawn – си-подобный скриптовый язык программирования и бла-бла-бла.
Именно на нём пишутся сервера для нашей любимой игры. Для того, чтобы решить нашу задачу, нужно понять, как это работает изнутри. Обратимся к исходному коду, который, к счастью, был любезно оставлен авторами: тык
Обратите внимание на строку №446: именно здесь начинается нужная нам функция. Это линейный конгруэнтный генератор — один из самый популярных и простых в создании генераторов псевдослучайных чисел. Мы любезно позаимствуем эту фунцию в свой код. На основе этой функции я написал программу, позволяющую удобно генерировать числа. Код ниже:

Генератор:
int main()
{
    int mod;
    cout << "Enter module of number (0 if not): ";
    cin >> mod;
    while (true)
    {
        cin.ignore();
        cout << "Your number is " << noRandom(mod);
    }

    return 0;
}

*Это лишь пример, поэтому если вы бездумно скопируете, скорее всего у вас ничего не получится. В своей статье я буду вставлять только основную часть, а не весь код. Если вам понадобится, вы сможете самостоятельно написать нужную вам программу, потому что я описываю достаточно простые для понимания вещи.
Теория
Каждый линейный генератор псевдослучайных чисел имеет периодичность. Это значит, что через n генераций последовательность начнёт повторяться. В нашем случае это число 2^32. Проверить это можно написав следующий код:
Период:
void main()
{
    for(unsigned long long i = 0; i < RANDOM_PERIOD; i++)
    {
        noRandom();
        if (((i + 1) % 4294967UL) == 0UL)
        {
            cout << "\rProgress: " << int((double)i / (double)RANDOM_PERIOD * 100) << "%" << flush;
        }
    }
    cout << "\rProgress: " << "100% - copmleted" << endl;
    while(true)
    {
        cin.ignore();
        cout << noRandom() << endl;
    }
}
Здесь RANDOM_PERIOD – 2^32.

Вывод:
Посмотреть вложение 180875
Мы видим, что числа совпадают. Это значит, что если знать некоторую последовательность чисел, то возможно определить следующее генерируемое число. Но есть один нюанс.
Практика: Решение в лоб
Я написал функцию, ищущую примерную последовательность среди псевдослучайно сгенерированых чисел. Что значит примерную? Это значит, что между числами в последовательности может быть до n неизвестных чисел. Почему примерную? Помните я говорил о нюансе? Так вот, если искать точную последовательность, то у вас скорее всего ничего не выйдет, потому что помимо вас на сервере множество игроков, вызывающих функцию random своими действиями. Я пытался проверить работу этой программы на реальном сервере с малым количеством игроков, заплатил свои кровные 150 рублей криптону для того, чтобы он соорудил мне плагин для SAMPFUNCS, ибо сам я под самп ничего писать не умею, но, увы, ничего не вышло. То ли я дурак, то ли лыжи не едут. Проще говоря, я потратил на тесты довольно много времени, а выхлопа как не было, так и нет. Зато всё прекрасно работает на сервере с одним игроком. Это я показал в видео - клац. А вот и код:
Поиск:
int optimizedSearch(vector<int> pat, int mod, int k)
{
    int M = pat.size();

    int result = -1;

    if (k > RANDOM_PERIOD - M)
        return result; // k is out of range

    int j, c;
    for (unsigned long i = 0; i < RANDOM_PERIOD - M - c; ++i) {
        c = 0;
        for (j = 0; j < M + c; ++j)
        {
            if (noRandom(mod) != pat[j - c])
            {
                if (j == 0)
                    break;
                ++c;
            }
            if (c > k)
            {
                c = k;
                break;
            }
        }
        if (j == M + c)
        {
            return 1;
        }
    }
    return result;
}
Алгоритм вернёт 1, если последовательность будет найдена и -1, если нет. Если вам вернётся 1, то нужно будет просто вызывать функцию рандома, чтобы получать следующие числа.
Почему в лоб? Есть ли ещё какое-то решение?

Да, скорее всего есть более быстрый алгоритм поиска, основанный на математический вычислениях. Я не стал этим заниматься,потому что, как я писал выше, мне надоело. Возможно, вложившись в его написание у вас получится отыграть все деньги, проигранные в баре? ;)

Что будет дальше?

Надеюсь, люди воспримут меня всерьёз и умельцы смогут сделать настоящий чит для казино. Но, к сожалению, сейчас это возможно только на бумаге.

Огромная благодарность за то, что прочитали мою статью. Надеюсь, она вдохновит вас на подвиги ;) Удачи.
Я тупой чет, можешь скинуть сразу готовый файл ? А то код готовый не могу никак превратить в прогу через Visual Studio Code 😅