Foros del Web » Programación para mayores de 30 ;) » Programación General »

Operación matemática, calcular regla de tres o porcentaje a partir de un total

Estas en el tema de Operación matemática, calcular regla de tres o porcentaje a partir de un total en el foro de Programación General en Foros del Web. Hola. No sabía donde colocar este tema así que lo planteo aquí. Tengo una duda donde por ejemplo si tengo un total de 230 participantes ...
  #1 (permalink)  
Antiguo 15/06/2015, 10:47
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Operación matemática, calcular regla de tres o porcentaje a partir de un total

Hola.

No sabía donde colocar este tema así que lo planteo aquí.

Tengo una duda donde por ejemplo si tengo un total de 230 participantes y la posición es la 230 ese participante ganaría 1 punto y si queda en la posición 1 ese participante ganaría 10 puntos. ¿Cuantos puntos ganaría por ejemplo el participante en la posición 29?

He intentando mirando varios ejemplos de reglas de tres compuestas, inversas y alguna que otra pero no logro sacar o comprender como aplicaría esas reglas a este ejercicio. Tampoco se si la manera de plantearla es la correcta y si debe hacerse con porcentajes en vez de regla de tres.

230 - 1
29 - x
1 - 10

¿Alguna ayuda? Gracias de antemano.

Saludos. :)
  #2 (permalink)  
Antiguo 15/06/2015, 11:11
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 7 meses
Puntos: 578
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

En toda regla de tres, siempre debe haber una constante de proporcionalidad. Como no siempre dará un valor entero, puedes hacer un redondeo o asociar los puntos con rangos numéricos.
  #3 (permalink)  
Antiguo 15/06/2015, 12:10
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

Lo que necesitás es llevar tu número de participantes a una escala del 1 al 10. Creo que la palabra adecuada para esto es "normalizar".

posición 1 = 1
posición 230 = 10

con lo que podemos tomar cada paso, o punto de quiebre, en 23 (230/10):
1-23 = 1
24-46 = 2
...
208-230 = 10

podemos usar una fórmula entonces:

puntaje = ceil(pos/23), o ceil(posicion*total_participantes/puntaje_máximo)

Si posición = 25, entonces puntaje = ceil(25/23) ~ ceil(1.1)= 2
Si posición = 100, entonces puntaje = ceil(100/23) ~ ceil(4.3) = 5

esta solución tiene dos problemas, fácilmente ajustables:
- da el puntaje máximo a la posición 230, en vez de a la 1
- en vez de dar el puntaje máximo a la posición máxima, se lo da a un rango. Esto lo podemos arreglar con floor() en vez de ceil()

Obviamente este proceso tiene un problema, que es
  #4 (permalink)  
Antiguo 15/06/2015, 14:06
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

Cita:
Iniciado por PHPeros Ver Mensaje
En toda regla de tres, siempre debe haber una constante de proporcionalidad. Como no siempre dará un valor entero, puedes hacer un redondeo o asociar los puntos con rangos numéricos.
Hola PHPeros, la verdad es que he estado intentando encontrar en este caso la constante de proporcionalidad y he sido incapaz, lo máximo que he visto cerca ha sido 0,04 y en otros casos ni si quiere la he encontrado, es decir que me parecía que no tenía en este caso, supongo que no he seguido el camino correcto.

Cita:
Iniciado por AlvaroG Ver Mensaje
Lo que necesitás es llevar tu número de participantes a una escala del 1 al 10. Creo que la palabra adecuada para esto es "normalizar".

posición 1 = 1
posición 230 = 10

con lo que podemos tomar cada paso, o punto de quiebre, en 23 (230/10):
1-23 = 1
24-46 = 2
...
208-230 = 10

podemos usar una fórmula entonces:

puntaje = ceil(pos/23), o ceil(posicion*total_participantes/puntaje_máximo)

Si posición = 25, entonces puntaje = ceil(25/23) ~ ceil(1.1)= 2
Si posición = 100, entonces puntaje = ceil(100/23) ~ ceil(4.3) = 5

esta solución tiene dos problemas, fácilmente ajustables:
- da el puntaje máximo a la posición 230, en vez de a la 1
- en vez de dar el puntaje máximo a la posición máxima, se lo da a un rango. Esto lo podemos arreglar con floor() en vez de ceil()

Obviamente este proceso tiene un problema, que es
Hola AlvaroG, he aplicado tu ejemplo a la inversa haciendo una tabla de mayor a menor pero luego me he vuelto a hacer un lio en las fórmulas ya que las tuyas eran inversas y por más que lo intento me he ido perdiendo... sin embargo tu ejemplo me sirve de mucho ya que tengo una tabla por tiempos de minutos en la que tendré que hacer algo parecido, es más ya hice una parecida hace tiempo pero al ser minutos y segundos aún no es tan exacta.

Por otro lado he recibido esta explicación y fórmula, que creo que se adapta perfectamente a mi ejemplo e incluso a otros que voy a usar en un futuro.

Cita:
El menor puntaje es 1 y, el mayor, 10. Esto significa que todos tienen 1 punto y que los otros 9 puntos se obtienen en forma inversamente proporcional al puesto que ocupen entre los 230, de tal forma que quien ocupe el puesto 1 obtiene 9 puntos adicionales y quien ocupe el puesto 230, cero puntos adicionales. O sea, puntaje adicional reciben 229 participantes (el 230 no recibe) en forma proporcional a (230-n):

P=1+9*(230-n)/229
Creo que esta parte está resuelta, aún así voy a seguir probando las diferentes maneras expuestas ya que como digo tengo que hacer nuevas fórmulas para tablas con tiempos, km y algun parámetro más y me interesa aprenderlo de la mejor manera.

Muchas gracias por vuestra ayuda, saludos
  #5 (permalink)  
Antiguo 16/06/2015, 01:24
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

el valor máximo (230) se lleva el 100% de los puntos dsponibles (10) - el tanto por ciento del número con respecto al número máximo (230 de 230 es el 100%)*10+1;

230-->(10-Redondeo(230/230*10))+1=1

La mitad de 230=115, probemos el 115.

115-->(10-Redondeo(115/230*10))+1=10-5+1=6

Ahora el 1.

1-->(10-Redondeo(1/230*10))+1=10-0+1=11
Si (Redondeo(numero/total*10)<1)resultado_Redondeo=1;
1-->(10-Redondeo(1/230*10))+1=10-1+1=10


Explicación de por qué la mitad de tu rango no se lleva la mitad de puntos, sino la mitad+1:
Tú empiezas desde 1, 1 es tu valor mínimo. Por lo tanto estás variando todos los valores que corresponden desde el 1 hasta el 230. Para aclarártelo... si en un examen sacas 0.8 y el profesor ha de redondear a la baja a un número entero habrás sacado un 0. Si redondea al entero más cercano un 1. Pero s sacas un 0.3 al redondear sacarás un 0 igualmente. No un 1. En tu ejercicio, el valor mínimo no es un 0, por lo cual la mitad de tus números ya no saca la mitad de los puntos disponibles, sino 1 más.

Última edición por Kritik; 16/06/2015 a las 01:32
  #6 (permalink)  
Antiguo 16/06/2015, 04:16
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

Hola Kritik.

Ayer hice una prueba y la verdad es que si vi que hay un poco más de puntuación justo en el medio, de todas formas en principio parece que me sirve ya que las puntuaciones que iría sumando serán con dos decimales y así por ejemplo en este caso quedarían así:

P=1+9*(230-n)/229
2 -> 9.96
3 -> 9.92
29 -> 8.89
115 -> 5.51
116 -> 5.48
230 -> 1.03

Sin embargo ahora viendo tu ejemplo he intentado descifrarlo o cambiarlo y me saldría algo así:

P=10*(230-n)/229
2-> 9.95
3 -> 9.91
29 -> 8.77
115-> 5.02
116 -> 4.97
230 -> 0.04

No se si es exactamente así el problema que me explicas pero sí parece que es más acertado que el anterior.

Gracias, un saludo
  #7 (permalink)  
Antiguo 20/06/2015, 23:57
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

Cita:
Iniciado por kahlito Ver Mensaje
P=10*(230-n)/229
2-> 9.95
3 -> 9.91
29 -> 8.77
115-> 5.02
116 -> 4.97
230 -> 0.04
Bueno, en este caso tu fórmula se aproxima al valor mínimo de 0. Y en un principio el problema matemático era la obtención de la fórmula que diese valores entre 1 y 10, no entre 0 y 10.

Por otra parte, al dividir entre el nº total de valores-1 (dividir entre 229) resulta que el valor 1 consigue el resultado 10, pero el valor 0 consigue el 10.04. Puede ser válido siempre y cuando tu valor mínimo sea el 1.

Sin embargo, el valor máximo no consigue el resultado mínimo. Pues el valor 230 no consigue con tu fórmula un 0, sino un 0.04. Esto se arreglaría dividiendo entre 230, en vez de entre 229. Sin embargo, al dividir entre 230 el número máximo (230) conseguiría el 0 buscado. Sin embargo sería el 0 el que conseguiría el resultado de 10, y el 1 el que conseguiría un 9.96

Para saber qué fórmula necesitas especifica bien el problema. El valor mínimo, el valor máximo, el resultado mínimo buscado y el resultado máximo buscado.

Última edición por Kritik; 21/06/2015 a las 00:06
  #8 (permalink)  
Antiguo 04/08/2015, 06:31
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

Hola de nuevo Kritik, perdón por la tardanza en responder.

En mi anterior ejemplo el último da 0.04 porque lo hice mal, en realidad quedaría algo así:

P=10*(230-n)/229
2-> 9.95
3 -> 9.91
29 -> 8.77
115-> 5.02
116 -> 4.97
230 -> 0

Sin embargo probando tu nueva explicación dividiendolo entre 230 parece que la mitad es justo el 5 y es más cercano a lo que busco.

P=10*(230-n)/230
2-> 9.91
3 -> 9.86
29 -> 8.73
115-> 5
116 -> 4.95
230 -> 0


Para saber qué fórmula necesitas especifica bien el problema. El valor mínimo, el valor máximo, el resultado mínimo buscado y el resultado máximo buscado.

El problema es buscar el valor máximo con un 10 y el mínimo con un 1 o un 0, por ejemplo en este caso sería 1=10 (primero) y 230=0 (último)

Habra veces que en vez de ser 230 participantes serán 500, 2000 etc etc y de ahí entonces aplicar esa formula según la posición que cada participante finalice y recibir una puntuación del 1 al 10 o del 0 al 10.

Gracias de nuevo, saludos
  #9 (permalink)  
Antiguo 10/08/2015, 23:19
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

Como ves, la fórmula cambia según si la nota obtenida va del 0 al 10 o del 1 al 10. Tú eres el diseñador del programa, eres el que debe decidir el comportamiento de dicho programa. Dependiendo de esta decisión la fórmula será una u otra.

En cuanto al número de participantes eso es lo de menos, calcula tu fórmula para el ejemplo dado de 230 participantes, y cuando tengas la fórmula cambia el número 230 por una variable que almacene el número de participantes... y listo, y si tu fórmula tiene un 229 pues pon entre paréntesis tu variable - 1. P.ej: (nparticpantes-1)

Pero lo más importante para tu programa es que decidas, antes de buscar una fórmula o antes de escribir 1 sola línea de código... es que sepas exactamente qué es lo que quieres obtener. Si una nota mínima de 0 o de 1.

Saludos!
  #10 (permalink)  
Antiguo 12/08/2015, 10:11
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

Hola @kahlito, matematicamente puedes plantear la variacion en la puntuacion como una funcion, para darte un ejemplo voy a asumir que se trata de una funcion lineal, es decir, que la puntuacion varia de forma proporcinal y constante de un punto a otro.

Sabemos que la ecuacion de una funcion lineal es:
y = mx + b
donde b es la ordenada al origen y su formula sale de despejar en la ecuacion anterior:
b = y - mx
y donde m es la pendiente y su formula es:
m = (y2-y1) / (x2-x1);
donde los puntos (x1, y1) y (x2, y2) son conocidos, en el caso del ejemplo estos puntos son: (1, 10) y (230, 1).

Ahora lo que sigue es allar m, por lo tanto:
m = (1 - 10) / (230 - 1) = -0.0393013100436681222707423580786
Ahora lo que sigue es allar b, por lo tanto tomamos un punto cualquiera de los 2 conocidos:
b = 10 - (-0.0393013100436681222707423580786 * 1) = 10.0393013100436681222707423580786

Y listo, la funcion ahora queda:
y = (-0.0393013100436681222707423580786 * x) + 10.0393013100436681222707423580786

Graficamente:


Por supuesto que podria ser una funcion polinomica, logaritmica inversa, senoidal o cualquier otra cosa, to doy el ejemplo con la lineal que es la mas simple y que creo es que necesitas.

Ej de codigo en PHP:
Código PHP:
Ver original
  1. <?php
  2.     class ScoreIEPolateLineal {
  3.         /*/
  4.          * Dos puntos conocidos expresados de la forma [x, y]
  5.          * Donde x es el numero de posicion.
  6.          * Donde y es la puntuacion de esa posicion.
  7.         /*/
  8.         private $p1;
  9.         private $p2;
  10.        
  11.         /*/
  12.          * La pendiente y la ordenada al origen de la recta.
  13.         /*/
  14.         private $incline;
  15.         private $oo;
  16.  
  17.         public function __construct($p1, $p2) {
  18.             $this->p1 = $p1;
  19.             $this->p2 = $p2;
  20.             $this->incline = (($this->p2[1] - $this->p1[1]) / ($this->p2[0] - $this->p1[0]));
  21.             $this->oo = ($this->p1[1] - ($this->incline * $this->p1[0]));
  22.         }
  23.  
  24.         /*/
  25.          * Posicion de la que te interesa saber la puntuacion.
  26.          * Si esta dentro del rango [x1, x2] la puntuacion sera interpolada
  27.          * Dentro del rango [y1, y2] de forma linel.
  28.          * Si esta fuera del rango [x1, x2] la puntuacion sera extrapolada
  29.          * Fuera del rango [y1, y2] de forma linel.
  30.         /*/
  31.         public function calculate($pos) {            
  32.             return ($this->incline * $pos) + $this->oo; // y = mx + b
  33.         }
  34.     }
  35.  
  36.     $calculator = new ScoreIEPolateLineal([1,10], [230,1]);
  37.     echo "<table><tr><th>Pos</th><th>Puntos</th></tr>";
  38.     for($pos = -10; $pos <= 240; $pos++)
  39.         echo "<tr><td>$pos</td><td>".$calculator->calculate($pos)."</td></tr>";
  40.     echo "</table>";
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 13/08/2015 a las 09:47
  #11 (permalink)  
Antiguo 21/08/2015, 14:14
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.936
Antigüedad: 21 años, 1 mes
Puntos: 65
Respuesta: Operación matemática, calcular regla de tres o porcentaje a partir de un t

Hola de nuevo.

Así es Kritik por ahora retomo el tema y en cuanto lo tenga listo lo vuelvo a poner aquí.

NSD, tengo que probar dicha opción, hasta ahora no he podido retomar ese tema y ahora al volver me quedo sorprendido con esta nueva respuesta de matemáticas pura y dura

Muchas gracias de nuevo a ambos por la ayuda.

Etiquetas: calcular, porcentaje, regla, tres
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:02.