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

Всем привет! У меня есть несколько значений (integer):
PHP код:
2
3
6
8

В данный момент все происходит довольно просто:
PHP код:
// Переменная:
new test;
// Выпадение рандомного числа:
test random_N(23689);
// Функция:
stock random_N(...) return getarg(random(numargs())); 
Я хочу сделать возможность, что бы число могло выпасть с определенным шансом:
PHP код:
40%
25%
5%
10%
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 
0numargs();
    if(
2) return -1;
    static var[
100];
    for(new 
1ni+=2)
    {
        for(new 
0!= getarg(i); p++)
        {
            if(
== 100) return -1;
            var[
x++] = getarg(i-1);
        }
    }
    return var[
random(100)];

Еще варианты придумал, получше будут.
PHP код:
// в сумме обязательно 100%
stock rand(...) // by SoNik))
{
    new 
numargs();
    if(
2) return -1;
    new 
svrandom(100);
    for(new 
1ni+=2)
    {
        
getarg(i);
        if(
<= <= v) return getarg(i-1);
        
+= v;
    }
    return -
1;
}
// общее количество процентов неважно, соотношение вычисляется автоматом
// new v = rand(5,10, 7,90, 76,150); - вычтет из 250%
stock rand(...) // by SoNik))
{
    new 
cnumargs();
    if(
2) return -1;
    for(new 
ini+=2+= getarg(i+1);
    new 
svrandom(c);
    for(new 
1ni+=2)
    {
        
getarg(i);
        if(
<= <= v) return getarg(i-1);
        
+= v;
    }
    return -
1;

Reply
#4

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

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

PHP код:
stock randomex(data[], &resultlen sizeof data)
{
    if(
len == 0)
    {
        new 
index = -42;
        for(new 
1sumrand random(100); len+= 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 1;
                    }
                }
            }
        }
        
result data[index];
        return 
index;
    }
    return -
1;

Использование:

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

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

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

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


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


Forum Jump:


Users browsing this thread: 1 Guest(s)