Рандом с процентами
#1

Всем привет! У меня есть несколько значений (integer):
PHP код:
2
3
6
8
9 
В данный момент все происходит довольно просто:
PHP код:
// Переменная:
new test;
// Выпадение рандомного числа:
test = random_N(2, 3, 6, 8, 9);
// Функция:
stock random_N(...) return getarg(random(numargs())); 
Я хочу сделать возможность, что бы число могло выпасть с определенным шансом:
PHP код:
2 - 40%
3 - 25%
6 - 5%
8 - 10%
9 - 20% 
Но к сожалению как это сделать не могу придумать. Сможет ли кто то мне помочь?
Буду рад даже простому совету.
Reply
#2

Был конечно вариант сделать вот так:
PHP код:
// Переменная: 
new test; 
// Выпадение рандомного числа: 
test = Rands(); 
// Функция: 
stock Rands() {
    switch(
random(99)) {
        case 
0..39: return 2;
        case 
40..64: return 3;
        case 
65..69: return 6;
        case 
70..79: return 8;
        case 
80..99: return 9;
    }
    return -
1;
} 
Но что то мне это совсем не нравиться...
Reply
#3

Заинтересовал меня данный вопрос, в побеге от скуки.
PHP код:
// число, процент ..... число, процент - в сумме обязательно 100%
// new v = rand(3,70,  78,10,  64,15,  17,5);
stock rand(...) // by SoNik))
{
    new 
x = 0, n = numargs();
    if(
n % 2) return -1;
    static var[
100];
    for(new 
i = 1; i < n; i+=2)
    {
        for(new 
p = 0; p != getarg(i); p++)
        {
            if(
x == 100) return -1;
            var[
x++] = getarg(i-1);
        }
    }
    return var[
random(100)];
} 
Еще варианты придумал, получше будут.
PHP код:
// в сумме обязательно 100%
stock rand(...) // by SoNik))
{
    new 
n = numargs();
    if(
n % 2) return -1;
    new 
s, v, r = random(100);
    for(new 
i = 1; i < n; i+=2)
    {
        
v = getarg(i);
        if(
s <= r <= s + v) return getarg(i-1);
        
s += v;
    }
    return -
1;
}
// общее количество процентов неважно, соотношение вычисляется автоматом
// new v = rand(5,10, 7,90, 76,150); - вычтет из 250%
stock rand(...) // by SoNik))
{
    new 
c, n = numargs();
    if(
n % 2) return -1;
    for(new 
i; i < n; i+=2) c += getarg(i+1);
    new 
s, v, r = random(c);
    for(new 
i = 1; i < n; i+=2)
    {
        
v = getarg(i);
        if(
s <= r <= s + v) return getarg(i-1);
        
s += v;
    }
    return -
1;
} 
Reply
#4

Спасибо за помощь! 3й вариант довольно не плохой, мне понравился.
Reply
#5

Вот еще. Хотел вчера скинуть, но тырнет пропал, а щас уже пост чуть выше обновился

PHP код:
stock randomex(data[], &result, len = sizeof data)
{
    if(
len % 2 == 0)
    {
        new 
index = -42;
        for(new 
i = 1, sum, rand = random(100); i < len; i += 2)
        {
            if(
data[i] < 1)
            {
                return -
3;
            }
            else
            {
                
sum += data[i];
                if(
sum > 100)
                {
                    return -
2;
                }
                else if(
index == -42)
                {
                    if((
sum - data[i]) <= rand <= sum)
                    {
                        
index = i - 1;
                    }
                }
            }
        }
        
result = data[index];
        return 
index;
    }
    return -
1;
} 
Использование:

PHP код:
new rand;
randomex({ 1, 80, 2, 15, 3, 5 }, rand); //{ значение, вероятность, значение, вероятность, ... }
printf("Выпало значение: %d", rand); 
В любом случае, тут пару полезных нюансов есть, и без getarg
Reply
#6

stabker, дал функцию, но не показал, как пользоваться
Reply
#7

Quote:
Originally Posted by SoNikMells
Посмотреть сообщение
stabker, дал функцию, но не показал, как пользоваться
Я думал, что все очевидно. Так же само:

PHP код:
new rand;
randomex({ 1, 80, 2, 15, 3, 5 }, rand); //{ значение, вероятность, значение, вероятность, ... }
printf("Выпало значение: %d", rand); 
Reply
#8


мой второй вариант с getarg(); быстрее в 2 раза
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)