Ésta función la había creado para mi ZP ya que los usuarios dependiendo sus objetos, podían tener mayor o menor chance de ser seleccionado para ser un modo especial.
Esto aplica a cualquier cosa que ustedes quieran.
Bien, cómo funciona esto.
Una pequeña analogía, si nosotros tenemos 3 personas correspondientes a los números del 1 al 3, y necesitamos seleccionar uno para rescatar, para seleccionar uno simplemente lanzamos un número al azar del 1 al 3 y el que salga, es el rescatado.
Todas las personas en esa situación tienen la misma probabilidad de ser elegidos.
Ahora bien, digamos que justo la persona número 2 por ser un buen ciudadano, tiene una mayor probabilidad de ser elegido para ser rescatado, para lograr esto, se necesita que cada persona tenga un 'puntaje', en este ejemplo, 2 personas tendrán un puntaje de 100, mientras que el restante tendrá 200 puntos.
Se lanza un número al azar entre 1 y 400 (la suma total de todos los puntajes) y luego se compara uno por uno a quien le correspondía ese rango.
1..100 a la persona 1.
101..300 a la persona 2.
301..400 a la persona 3.
Inicio:
Primera pasada:
Segunda pasada:
Si no entendiste una mierda, lee el código, es pura lógica.
Esto aplica a cualquier cosa que ustedes quieran.
Código PHP:
new g_MaxUsers;
g_MaxUsers = get_maxplayers();
GetRandomUserWithChance(const userAlive) {
static iRandom;
static iTeam;
static i;
static iChance[33];
static iTotalChance;
static iSum;
iTotalChance = 0;
iSum = 0;
for(i = 1; i <= g_MaxUsers; ++i) {
iChance[i] = 0;
if(!is_user_connected(i) || (userAlive && !is_user_alive(i))) {
continue;
}
// Comprobar a que Team pertence si es que te interesa.
iChance[i] = 100;
iChance[i] += tuVariableMagica[i]; // Acá utilizá las variables que sumen/resten la chance del usuario.
iTotalChance += iChance[i];
}
iRandom = random_num(1, iTotalChance);
for(i = 1; i <= g_MaxUsers; ++i) {
if(!is_user_connected(i) || (userAlive && !is_user_alive(i))) {
continue;
}
// Comprobar a que Team pertence si es que te interesa.
iSum += iChance[i];
if(iRandom <= iSum) {
return i;
}
}
return -1;
}
Bien, cómo funciona esto.
Una pequeña analogía, si nosotros tenemos 3 personas correspondientes a los números del 1 al 3, y necesitamos seleccionar uno para rescatar, para seleccionar uno simplemente lanzamos un número al azar del 1 al 3 y el que salga, es el rescatado.
Todas las personas en esa situación tienen la misma probabilidad de ser elegidos.
Ahora bien, digamos que justo la persona número 2 por ser un buen ciudadano, tiene una mayor probabilidad de ser elegido para ser rescatado, para lograr esto, se necesita que cada persona tenga un 'puntaje', en este ejemplo, 2 personas tendrán un puntaje de 100, mientras que el restante tendrá 200 puntos.
Se lanza un número al azar entre 1 y 400 (la suma total de todos los puntajes) y luego se compara uno por uno a quien le correspondía ese rango.
1..100 a la persona 1.
101..300 a la persona 2.
301..400 a la persona 3.
Inicio:
Código PHP:
iSum = 0;
iChance[0] = 100;
iChance[1] = 200;
iChance[2] = 100;
iRandom = random_num(1, 400); // La suma de todos los puntajes.
// Asumamos que iRandom vale 216.
Primera pasada:
Código PHP:
iSum += iChance[0]; // iSum = 100
if(iRandom <= iSum) // 216 <= 100 ? Nop, siguiente pasada.
Segunda pasada:
Código PHP:
iSum += iChance[1]; // iSum = 300
if(iRandom <= iSum) // 216 <= 300 ? Sip, devolver ésta persona y ni nos vimo.
Si no entendiste una mierda, lee el código, es pura lógica.