Рандом с процентами -
Romz - 23.05.2016
Всем привет! У меня есть несколько значений (integer):
В данный момент все происходит довольно просто:
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%
Но к сожалению как это сделать не могу придумать. Сможет ли кто то мне помочь?
Буду рад даже простому совету.
Re: Рандом с процентами -
Romz - 23.05.2016
Был конечно вариант сделать вот так:
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;
}
Но что то мне это совсем не нравиться...
Re: Рандом с процентами -
SoNikMells - 25.05.2016
Заинтересовал меня данный вопрос, в побеге от скуки.
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;
}
Re: Рандом с процентами -
Romz - 25.05.2016
Спасибо за помощь! 3й вариант довольно не плохой, мне понравился.
Re: Рандом с процентами -
stabker - 26.05.2016
Вот еще. Хотел вчера скинуть, но тырнет пропал, а щас уже пост чуть выше обновился
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
Re: Рандом с процентами -
SoNikMells - 26.05.2016
stabker, дал функцию, но не показал, как пользоваться
Re: Рандом с процентами -
stabker - 26.05.2016
Quote:
Originally Posted by SoNikMells
stabker, дал функцию, но не показал, как пользоваться
|
Я думал, что все очевидно. Так же само:
PHP код:
new rand;
randomex({ 1, 80, 2, 15, 3, 5 }, rand); //{ значение, вероятность, значение, вероятность, ... }
printf("Выпало значение: %d", rand);
Re: Рандом с процентами -
SoNikMells - 26.05.2016
мой второй вариант с getarg(); быстрее в 2 раза