Вопрос о random_num.

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
61
Реакции
24
Помог
1 раз(а)
Здравствуйте, пытался найти информацию, но или не нашел подходящую или слишком сложное оказалось и пропустил за непониманием.
Данная функция random_num выдает случайное значение числа, в диапазоне. Но у нее есть небольшой минус в том, что если вызывать ее допустим каждый раунд, она может выдать одно и тоже число пару раундов подряд.
Собственно, может кто нибудь подсказать, как "запомнить" это самое, случайное число с прошлого раунда, сравнить с новым полученным от функции random_num, и если они совпали, снова запустить функцию random_num для получения нового числа и лишь потом продолжать выполнение функции.
Не нашел к сожалению не в одном плагине, на просторах как это может быть реализовано.
В скриптинге, только смотря на готовый код других что то выдернуть полезное могу, не более, может кто подсказать с кодом, как это реализовать.

Код:
1. new num = random_num(0, 20)

2. Что то делаем испльзуя num (проигрываем случайный трек)
3. Запоминаем num в допустим  new oldnum = num
4. Наступает новый раунд.
5. Снова запускаем new num = random_num(0, 20)
6. Сравниваем if(oldnum != num) если не равны.
7. То шаг 2, 3, 4, 5.
8. А если if(oldnum == num) равны, то.  Шаг 5. Снова запускаем new num = random_num(0, 20)
9. Далее шаг 6, вдруг снова совпали, если нет. То шаг 2, 3, 4, 5.

Может я конечно, что то не так делаю, подскажите, может есть какой то простой выход.
Использую банально, в плагине музыки, не хочу грузить клиент сотнями треков, что бы минимизировать возможность повтора, использовать планирую лишь 20, но чем меньше диапазон тем выше шанс поймать одно и тоже число в random_num.
По порядку не хочу проигрывать, учитывая 20 треков всего, и то что порой после 5-6 раундов могут сменить карту, и треки заново начнутся, до последних позиций может и не дойти, поэтому хотелось бы рандом, но без повторений.

Заранее спасибо за советы.
 
Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
Попробуйте
Код:
your_func()
{
    static iPrevVal // Можно объявить как глобальную переменную, если необходимо использование так же и вне функции
    new iVal
    while((iVal = random_num(начало_диапазона, конец_диапазона)) == iPrevVal) {} // Проводим рандомизацию, пока не устраним совпадение
    iPrevVal = iVal // Записываем значение
    // Ваш код, например
    client_cmd(0, "mp3 play %s", g_szMusic[iVal])
}
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
Код:
your_func()
{
    static iPrevNum;
    new iRandNum = iPrevNum = random_ex(20, iPrevNum);
}

// Генерирует числа от 0 до iMax, исключая число iExclude
stock random_ex(iMax, iExclude)
{
    iRand = (random(32767) + 100) % iMax;
    
    if (iRand == iExclude)
        iRand = iRand < iMax ? iRand + 1 : iRand - 1;
    
    return iRand;
}
Можно так же сделать исключение повторяющегося числа в самой функции random_ex (static iPrevNum перенести в random_ex).
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Код:
stock getRandomNum(max) {
    new lastNumStr[32];
    new lastNum = get_localinfo("last_random_num", lastNumStr, charsmax(lastNumStr)); // Полчаем последнее число с localinfo
    if (lastNum != 0) { // Если есть переводим строку в число
        lastNum = str_to_num(lastNumStr);
    }

    new maxNum = max * 100;
    new second;
    time(second, second, second); // Получаем количество текущих секунд
    for (new i = 0; i < second; i++) { // Проганяем псевдогенератор для увеличение внутреннего счетчика
        random(maxNum);
    }

    second = 0;
    new num = random(maxNum) % max; // Получаем число
    while (++second < 3 && num == lastNum) { // лимит попыток 3. Получаем число до тех пор пока новое число не равно пред
        num = random(maxNum) % max;
    }

    num_to_str(num, lastNumStr, charsmax(lastNumStr)); // Заносим в localinfo новое число
    set_localinfo("last_random_num", lastNumStr);

    return num;
}
 
Сообщения
61
Реакции
24
Помог
1 раз(а)
Спасибо большое за ответы, попробую применить, и отпишусь по результату.
 
Сообщения
29
Реакции
62
Использую банально, в плагине музыки, не хочу грузить клиент сотнями треков, что бы минимизировать возможность повтора, использовать планирую лишь 20, но чем меньше диапазон тем выше шанс поймать одно и тоже число в random_num.
По порядку не хочу проигрывать, учитывая 20 треков всего, и то что порой после 5-6 раундов могут сменить карту, и треки заново начнутся, до последних позиций может и не дойти, поэтому хотелось бы рандом, но без повторений.
Вы не правильно подходите к задаче.
В вашем случае можно рандомно отсортировать массив с треками при инициализации плагина, и потом работать уже с отсортированным массивом.
Вот вам рандомное проигрывание, и без повторений.
А юзать вайл, для того чтобы сравнивать и отсекать предыдущее значение это, во первых, - извращенство, во-вторых, все равно существует большой шанс получить этот же трек через один раунд.
 
Сообщения
61
Реакции
24
Помог
1 раз(а)
SerGrib, Вы правы, постараюсь найди пример реализации подобного в других работах людей, так как не могу представить как это выглядит в живую.
 
Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
Are_you_ready, киньте свою музяку, прикинем, как там можно развернуться
 
Сообщения
61
Реакции
24
Помог
1 раз(а)
BlackSignature, Хорошо, спасибо.

Код:
#include <amxmodx>

#pragma semicolon 1

new bool:Ismusic[33];
new const folder[32]= "music111/";
new const titles[][] = {
    "Carla's Dreams - Sub Pielea Mea",
    "HOMIE - 12 недель",
    "T-Fest x Скриптонит - Ламбада",
    "Макс Корж - Малый повзрослел",
    "Элджей feat Feduk - Розовое вино",
    "Benny Benassi & Chris Nasty - Aphrodisiak",
    "Wilkinson - Afterglow",
    "Teddy Killerz - Ravezone Anthem",
    "Bones - Frozen$",
    "Dj George A - Mahari (feat. Dep)",
    "Feduk - Моряк (Kolya Funk & Temmy Remix)",
    "GAZIROVKA - MAD-MA",
    "J Balvin, Willy William - Mi Gente",
    "Jah Khalib - Подойди поближе (Детка)",
    "Post Malone ft. 21 Savage - Rockstar",
    "Sofi Tukker feat. NERVO, The Knocks & Alisa Ueno - Best Friend",
    "ZAYN feat. Sia - Dusk Till Dawn",
    "Руки Вверх - Крошка моя",
    "Влад Соколовский feat. MCB 77 - Иди ко мне"
};



public plugin_init() {
    register_plugin("Music", "1.0", "S!p / Morozko");
    register_logevent("round_end", 2, "1=Round_End");
}
    
public plugin_precache()
{
   for(new count=1; count < sizeof(titles); count++)
   {
      new song[64];
      format(song, 63, "sound/%s%i.mp3", folder, count);
      precache_generic(song);
   }
}

public client_putinserver(id) Ismusic[id] = true;
public client_disconnected(id) Ismusic[id] = false;


public round_end()
{
    for(new i = 1; i <= get_maxplayers(); i++)
    {
        if(!is_user_connected(i) || !(Ismusic[i])) return;
        new num = random_num(0,sizeof(titles)-1);
        client_cmd(i, "mp3 stop");
        client_cmd(i, "mp3 play sound/%s%i.mp3", folder, num+1);
        client_print_color (i, 0, "^1Сейчас играет:^3 %s", titles[num]);
    }
}
На название песенок, прошу не обращайте внимание, что народ захотел увидеть, то и добавил)
А Ismusic, как задел добавлено, для менюшки с возможностью отключить кому не нужно.
 
Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
Are_you_ready,
Код:
// При открытии и сохранении данного файла необходимо использовать кодировку 'UTF-8 без BOM'

#define PLUGIN_NAME "Music"
#define PLUGIN_DATE "25.03.18" // "1.0"
#define PLUGIN_AUTHOR "S!p / Morozko" // fixed by mx?!

#include <amxmodx>

#pragma semicolon 1

new const g_szFolder[] = "sound/music111/";

new const g_szTitles[][] =
{
/* 0 */ "Carla's Dreams - Sub Pielea Mea",
/* 1 */ "HOMIE - 12 недель",
/* 2 */ "T-Fest x Скриптонит - Ламбада",
/* 3 */ "Макс Корж - Малый повзрослел",
/* 4 */ "Элджей feat Feduk - Розовое вино",
/* 5 */ "Benny Benassi & Chris Nasty - Aphrodisiak",
/* 6 */ "Wilkinson - Afterglow",
/* 7 */ "Teddy Killerz - Ravezone Anthem",
/* 8 */ "Bones - Frozen$",
/* 9 */ "Dj George A - Mahari (feat. Dep)",
/* 10 */ "Feduk - Моряк (Kolya Funk & Temmy Remix)",
/* 11 */ "GAZIROVKA - MAD-MA",
/* 12 */ "J Balvin, Willy William - Mi Gente",
/* 13 */ "Jah Khalib - Подойди поближе (Детка)",
/* 14 */ "Post Malone ft. 21 Savage - Rockstar",
/* 15 */ "Sofi Tukker feat. NERVO, The Knocks & Alisa Ueno - Best Friend",
/* 16 */ "ZAYN feat. Sia - Dusk Till Dawn",
/* 17 */ "Руки Вверх - Крошка моя",
/* 18 */ "Влад Соколовский feat. MCB 77 - Иди ко мне"
};

new g_iTracks[sizeof(g_szTitles)] = { 0, 1, ... };
new bool:g_bHasMusic[MAX_PLAYERS + 1], g_iMaxPlayers;

public plugin_init()
{
    register_plugin(PLUGIN_NAME, PLUGIN_DATE, PLUGIN_AUTHOR);
    register_logevent("round_end", 2, "1=Round_End");
    g_iMaxPlayers = get_maxplayers();
    SortIntegers(g_iTracks, sizeof(g_iTracks), Sort_Random);
   
    register_clcmd("say /music", "func_ToggleMusic");
}

public func_ToggleMusic(id)
{
    g_bHasMusic[id] = !g_bHasMusic[id];
    client_cmd(id, "spk buttons/blip1");
    client_print_color(id, print_team_red, "^4* ^1Вы %sлючили ^1музыку в конце раунда", !g_bHasMusic[id] ? "^3вы" : "^4вк");
    return PLUGIN_HANDLED;
}
   
public plugin_precache()
{
    for(new i = 1, szPath[64]; i < sizeof(g_szTitles); i++)
    {
        formatex(szPath, charsmax(szPath), "%s%d.mp3", g_szFolder, i);
        precache_generic(szPath);
    }
}

public client_putinserver(id)
    g_bHasMusic[id] = true;
   
/* public client_disconnected(id)
    g_bHasMusic[id] = false; */ // В данный момент не требуется

public round_end()
{
    static iPos;
   
    for(new id = 1, iPtr = g_iTracks[iPos]; id <= g_iMaxPlayers; id++)
    {
        if(!is_user_connected(id) || !g_bHasMusic[id]) continue;

        client_cmd(id, "mp3 stop; wait; mp3 play %s%d.mp3", g_szFolder, iPtr);
        client_print_color(id, print_team_default, "^1Сейчас играет:^3 %s", g_szTitles[iPtr]);
    }

    if(++iPos == sizeof(g_szTitles))
        iPos = 0;
}
 
Последнее редактирование:
Сообщения
61
Реакции
24
Помог
1 раз(а)
BlackSignature, Спасибо большое, попробую. Да уж, до такого бы сам врядли допер. Разве что за, простите, что не могу, поставить "лайк" пока нет попал в нужную категорию.
 
Сообщения
61
Реакции
24
Помог
1 раз(а)
Вопрос получился, не совсем в тему, но спасибо всем за помощь, я уверен кому нибудь пригодятся Ваши ответы.
Так же большое спасибо BlackSignature, за готовый вариант плагина.
Если кому интересно в посте от BlackSignature, готовый, рабочий вариант плагина, музыки в конце раунда, без кфг файлов и прочей лабуды.
По настройкам.

new const g_szFolder[] = "sound/music/";
тут указываете в какой папке будет Ваша музыка.

Код:
new const g_szTitles[][] =

{
"название исполнителя",
"название исполнителя",
"название исполнителя"
};
Обратите внимание, после последней песенке в списке, не должно быть запятой.
Тут указываете ваши песенки, кидая их в папку которая указана в g_szFolder называя файлы. 0.mp3, 1.mp3, 2.mp3, 3.mp3 и т.п. Обязательно начиная с нуля.
Компилируем плагин и готово!
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу