GetRandomUserWithChance (Seleccionar usuario al azar con probabilidades)
#1
É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.

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(
1<= 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(1iTotalChance);
    
    for(
1<= 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(1400); // 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.
Responder
#2
GJ as always y remarco:

(05/06/2016, 08:04 AM)KISKE escribió: Si no entendiste una mierda, lee el código, es pura lógica.
Responder
#3
Pura matemática, muy bueno
(03/07/2016, 11:24 PM)meTaLiCroSS escribió: Como lo hizo sasske es como lo estipule de un principio Proud
Responder
#4
Muy bueno, me gusta que sea matemático.

Pregunto por si las dudas, ya que a lo mejor usen el id para hacer funciones, no seria mejor hacer así el if?

Código PHP:
if(userAlive && !is_user_alive(i))

----

if(!
is_user_connected(i) || userAlive && !is_user_alive(i)) 
TFD ------ 10% (proyecto parado)

[Imagen: 76561198053053139.png]
Responder
#5
(05/06/2016, 04:22 PM)Matians escribió: Muy bueno, me gusta que sea matemático.

Pregunto por si las dudas, ya que a lo mejor usen el id para hacer funciones, no seria mejor hacer así el if?

Código PHP:
if(userAlive && !is_user_alive(i))

----

if(!
is_user_connected(i) || userAlive && !is_user_alive(i)) 

Buen ojo.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)