Диапазон 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(++i < sizeof(g_chance_counter)) s += g_chance_counter[i]
i = -1
while(++i < s) funcb()
server_print("Rounds - %i", s)
i = -1
while(++i < 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 (x <= 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(++i < sizeof(b)) s += b[i]
i = -1
while(++i < s) funcb()
server_print("Rounds - %i", s)
i = -1
while(++i < sizeof(b)) server_print("%i - %i", b[i], a[i])
}
public funcb()
{
new s = 0 // Это сумма всех кваров
new i = -1 // Счётчик кваров
while(++i < sizeof(b)) s += b[i] //Посчитали
if(s < 1) return // Все отключено
new r = random_num(1, s) // Случайное число в диапазоне суммы кваров
i = -1
new k = 0 // Переменная для счёта
while(++i < sizeof(b)) // Раскладываем числа друг за другом, и проверяем куда попал рандом.
{
if(b[i] < 1) continue // Если квар == 0 или меньше - пропустить
k += b[i] // Плюсуем значение квара
if(r <= 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
Но сам шанс выпадения всё равно остаётся так себе.
Может подряд выпадать одно и то же, ну пока не кончится.
Это надо запоминать выпавшие числа, чтобы не было одинаковых, но и это будет лишь приблизительно.