Русское сообщество по скриптингу

Шанс выпадения  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Re: Шанс выпадения

Сообщение артист666 » 18 мар 2018, 00:34

Тут чем больше значения, тем больше неточность.
Диапазон 0 - 100, а числа перекрывают друг друга.
2, 9, 10, 10, 10, 10, 50 = 101
0-1, 2-10, 11-20, 21-30, 31-40, 41-50, 51-100
И плюс рандом может из 100 выпадов одно и то же число выдать(теоритически).

Код: Выделить всё
#include <amxmodx>

// начинаем с самого маленького шанса и заканчиваем шансом 100%
new g_chance_counter[] = { 1, 10, 20, 30, 40, 50, 100 };
new a[7]

public plugin_init()
{
    register_concmd("y", "functions")
}
public functions(id)
{
    a = {0, 0, 0, 0, 0, 0, 0}
    
    new i 
= -1
    new s 
= 0
    
    while
(++< sizeof(g_chance_counter)) s += g_chance_counter[i]
    
    i 
= -1
    
    while
(++< s) funcb()
    
    server_print
("Rounds - %i", s)
    
    i 
= -1
    
    while
(++< sizeof(g_chance_counter)) server_print("%i - %i", g_chance_counter[i], a[i])
}
public funcb()
{
    new x = random(100);
    
    for 
(new i = 0; i< sizeof(g_chance_counter); i++)
    {
        if (<= g_chance_counter[i])
        {
            a[i]++
            break;// прерываем цикл т.к игрок уже получил подарок
        }
    }
}


Rounds - 251
1 - 2
10 - 23
20 - 24
30 - 25
40 - 27
50 - 27
100 - 123

Rounds - 251
1 - 5
10 - 29
20 - 19
30 - 20
40 - 29
50 - 24
100 - 125

Rounds - 251
1 - 3
10 - 19
20 - 16
30 - 27
40 - 20
50 - 28
100 - 138

Rounds - 251
1 - 3
10 - 17
20 - 28
30 - 17
40 - 27
50 - 28
100 - 131

Rounds - 251
1 - 8
10 - 25
20 - 28
30 - 22
40 - 18
50 - 27
100 - 123

Rounds - 251
1 - 6
10 - 24
20 - 23
30 - 22
40 - 23
50 - 29
100 - 124

Rounds - 251
1 - 4
10 - 25
20 - 24
30 - 27
40 - 21
50 - 24
100 - 126

Rounds - 251
1 - 6
10 - 19
20 - 27
30 - 30
40 - 19
50 - 23
100 - 127


Так можно сделать выпады более точными:
Код: Выделить всё
#include <amxmodx>

new b[] = {80, 40, 0, 10, 70, 55} // Допустим это значения кваров, и каждое может быть от 0 до скольки угодно.
new a[6]
new aa[6] // Счётчик, здесь хранятся выпады, его нужно сбрасывать раз в сумму кваров.

public plugin_init()
{
    register_concmd("y", "functions")
}
public functions(id)
{
    a = {0, 0, 0, 0, 0, 0}
    aa = {0, 0, 0, 0, 0, 0}
    
    new i 
= -1
    new s 
= 0
    
    while
(++< sizeof(b)) s += b[i]
    
    i 
= -1
    
    while
(++< s) funcb()
    
    server_print
("Rounds - %i", s)
    
    i 
= -1
    
    while
(++< sizeof(b)) server_print("%i - %i", b[i], a[i])
}
public funcb()
{
    new s = 0 // Это сумма всех кваров
    new i = -// Счётчик кваров
    
    while
(++< sizeof(b)) s += b[i] //Посчитали
    
    if
(< 1) return // Все отключено
    
    new r 
= random_num(1, s) // Случайное число в диапазоне суммы кваров
    
    i 
= -1
    new k 
= 0 // Переменная для счёта
    
    while
(++< sizeof(b)) // Раскладываем числа друг за другом, и проверяем куда попал рандом.
    {
        if(b[i] < 1) continue // Если квар == 0 или меньше - пропустить
        
        k 
+= b[i] // Плюсуем значение квара
        
        if
(<= k) // Если число попало в диапазон квара.
        {
            if(aa[i] < b[i])
            {
                // Выдаём бонус с номером - i
                //server_print("%i", i)
                a[i]++
                aa[i]++
                break
            
}
            else
            
{
                funcb()
                return
            
}
        }
    }
}


Rounds - 255
80 - 80
40 - 40
0 - 0
10 - 10
70 - 70
55 - 55

Rounds - 255
80 - 80
40 - 40
0 - 0
10 - 10
70 - 70
55 - 55

Rounds - 255
80 - 80
40 - 40
0 - 0
10 - 10
70 - 70
55 - 55

Rounds - 255
80 - 80
40 - 40
0 - 0
10 - 10
70 - 70
55 - 55

Rounds - 255
80 - 80
40 - 40
0 - 0
10 - 10
70 - 70
55 - 55

Rounds - 255
80 - 80
40 - 40
0 - 0
10 - 10
70 - 70
55 - 55


Но сам шанс выпадения всё равно остаётся так себе.
Может подряд выпадать одно и то же, ну пока не кончится.

Это надо запоминать выпавшие числа, чтобы не было одинаковых, но и это будет лишь приблизительно.
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Шанс выпадения

Сообщение RevCrew » 18 мар 2018, 11:08

артист666, еще раз, я не понимаю о чем ты.
Если идти от меньшего шанса к большему, в чем проблема?
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Шанс выпадения

Сообщение артист666 » 18 мар 2018, 17:37

Да, нормально всё. ))
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Пред.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 9