2010-12-30 14 views
5

Tengo una base de datos de películas donde necesito completar datos para que sea más fácil probar y desarrollar la aplicación. Hay tablas para almacenar clasificaciones de películas y cuentas de usuario, los usuarios califican las películas.¿Cómo aleatorizar valores entre 1 y 10 para clasificaciones realistas?

Comencé a desarrollar un script para rellenar la base de datos con datos falsos y genéricos, pero no sé cómo aleatorizar la calificación. Para cada película selecciono un número aleatorio de usuarios, 100, 500, 1000, lo que sea. Y para cada uno de esos usuarios selecciono aleatoriamente una clasificación del 1 al 10. Pero estas clasificaciones están dando como resultado el mismo promedio, alrededor de 5. Lo que significa que la distribución de calificaciones (1 a 10) para una película específica es básicamente la misma. Esto no es "realista" en absoluto, ya que todas las películas con calificaciones generadas de esta manera tendrán el mismo promedio, por lo tanto, las mismas calificaciones de diferentes usuarios y diferente cantidad de usuarios, realmente no importan.

Quería que la película A tuviera un promedio de 7, una media de la película B de 5, una media de la película C de 8, etc. ... Pero simplemente no quiero que el promedio sea diferente para cada película. Es decir, que sería bueno para producir clasificaciones de este tipo (para un número específico de usuarios): http://www.imdb.com/title/tt1046173/ratings o esta http://www.imdb.com/title/tt0486640/ratings

Ya sabes, algo al azar que podrían producir dos variaciones diferentes como los anteriores. Pulso actualizar y obtengo el primer gráfico, presiono actualizar y obtengo el segundo, presiono de nuevo y obtengo algo diferente o similar, algo "aleatorio" y "realista".

También voy a mostrar gráficos como este en mi aplicación, por lo que sería bueno tener diferentes distribuciones. Pero no tengo idea de cómo puedo lograrlo al azar con un simple script para generar todo eso.

¿Cómo puedo solucionar esto? Tal vez es demasiado trabajo que no vale la pena?

Tal vez algo más simple, como seleccionar un punto (entre 1 y 10) y luego crear una distribución normal de calificaciones donde ese punto seleccionado es el más alto, eso funcionaría para mí.

+0

No entiendo muy bien su pregunta ... ¿desea seleccionar aleatoriamente la tabla de clasificación de la lista de películas existente? – ajreal

+0

No, quiero aleatorizar clasificaciones que se parecen a las tablas anteriores para poder insertarlas en una base de datos y tener algunos datos para trabajar. –

+1

echo '9'; // No puedes probar que no es aleatorio –

Respuesta

4

Quiere corregir el promedio, y probablemente la varianza, y generar números aleatorios alrededor de los mismos.

Esto debería ayudar a empezar: Generating random numbers with known mean and variance

Editar: En realidad, si se piensa en ello esto se puede solucionar fácilmente: la razón de sus números tienden a 5, es porque su escala es de 1 a 10 (entonces la media es 5).

Simplemente tome sus números aleatorios, agregue 8 a todos ellos, y redondee cualquier número mayor que 10 a 10, y obtendrá algo centrado alrededor de 8 ish (pero sesgado arriba). ¿Probablemente lo suficientemente bueno para tus propósitos?

+0

No creo que sea eso. Los números tienden a 5 porque los números generados aleatoriamente son uniformes, la probabilidad de generar un número es exactamente la misma para cada otro número.Agregar 8 a todos ellos y redondear números mayores de 10 a 10 me dará algo ligeramente diferente, pero cada calificación tendrá una cantidad similar de votos. –

0

Mi opinión es que implica tiempo en la generación de números randon, también utiliza funciones como mt_rand para mejorar la generación aleatoria. Intenta hacer una flotación compleja op y la conversión a int y finalmente aplicando un% max_value para que el resultado se ajuste a tu límite.

Ejemplo:

function x() 
{ 
return (time() * 7.3333333333 * mt_rand(0.1 , 10.1)); 
} 

$rank = (x() + 3.99999) % 10); 

no digo que esto funciona, pero ilustrates la idea. ¡Espero eso ayude!

3

Tenga en cuenta que con los RNG estándar (generadores de números aleatorios) obtendrá una distribución de valores muy uniforme. Teniendo en cuenta suficientes valores "aleatorios" obtendrás resultados promedio, como habrás descubierto.Para la población de su base de datos, consideraría este enfoque:

Seleccione un número aleatorio que actuará como el puntaje promedio de la película. Luego, genere un conjunto de números aleatorios en el límite superior de ese promedio. Por ejemplo, si genera aleatoriamente un 7, genere números aleatorios entre 5 y 9. Luego, agregue un par de valores del 1 al 6 y del 8 al 10 para dar la apariencia de valores atípicos.

EDIT:

Este answer podría ser lo que usted está buscando, con código en Java.

Incluso Distribución Ejemplo:

Su código es probablemente similar a la siguiente:

public class EvenDistribution 
{ 
    private static Random random = new Random(); 

    public static void main(String[] args) 
    { 
     int maxValue = 20; 

     int[] distribution = new int[maxValue]; 

     int iterations = 1000; 

     for (int i = 0; i < iterations; i++) 
     { 
      int rand = random.nextInt(maxValue); 
      distribution[rand]++; 
     } 

     for (int i = 0; i < distribution.length; i++) 
     { 
      System.out.println(i+1+": "+distribution[i]); 
     } 
    } 
} 

Esta clase tenía la siguiente salida:

1: 47
2: 45
3 : 59
4: 5: 54
6: 52
7: 49
8: 49
9: 49
10: 48
11: 12: 43
13: 42
14: 15: 43
16: 55
17: 18: 55
19 : 64
20:

La distribución es muy uniforme. 19 parece un poco anormal, pero en general podemos decir que este método de RNG produce resultados predecibles.

Usando la biblioteca Math Uncommons mencionada anteriormente, utilicé el código similar, usando el GaussianGenerator.

public class RandomDistribution { 
    private static MersenneTwisterRNG random = new MersenneTwisterRNG(); 
    private static GaussianGenerator gen = new GaussianGenerator(7, 3, random); 

    public static void main(String[] args) 
    { 
     int maxValue = 20; 

     int[] distribution = new int[maxValue]; 

     int iterations = 1000; 

     for (int i = 0; i < iterations; i++) 
     { 
      int rand = Math.abs(gen.nextValue().intValue()); 
      distribution[rand]++; 
     } 

     for (int i = 0; i < distribution.length; i++) 
     { 
      System.out.println(i+1+": "+distribution[i]); 
     } 
    } 
} 

Se produce el siguiente resultado:

1: 19
2: 27
3: 41
4: 68
5: 110
6: 111
7: 125
8: 138
9: 125
10: 85
11: 64
12: 32
13: 32
14: 14
15: 5
16: 2
17: 1
18: 0
19: 1
20: 0

Parece que esta biblioteca sería muy buena para lo que estás tratando de lograr.

+0

Así que solo necesito algo así, pero para PHP. GaussionGenerator es probablemente lo que estoy buscando. –

+0

@Nazgulled: Math Uncommons es un software de código abierto, por lo que podría adaptar el código que utilizan para GausianGenerator a PHP. –

0

Como implica Kenny, que desea buscar en una Distribución normal. Si miras las calificaciones en IMDB, verás que la mayoría de las películas siguen una distribución normal. Las excepciones son los rankings superiores e inferiores. Mucha gente dirá que odian o aman una película: exageran su verdadero sentimiento, de ahí estos picos. Entonces, para un conjunto preciso de datos, deberá agregarlos. ¿Quizás dejar la clasificación más baja = (suma de las siguientes dos más bajas) * una constante?

+0

No necesito datos realmente precisos, simplemente no quiero que todas las películas tengan una distribución similar (solo para fines de prueba), centradas en el mismo medio. Voy a buscar en la distribución normal con PHP entonces. –

0

Yo también apoyo el consejo de Kenny pero me gustaría agregar una nota sobre la implementación. Aunque este no es el mejor enfoque, lo he implementado varias veces debido a su facilidad.

Imagine una matriz de diez elementos de largo cada elemento que contiene un valor de 10. Si generara un número aleatorio entre 1 y 100, podría contar en la matriz sumando cada elemento avanzando al siguiente índice de la matriz si el valor es mayor que la suma de los valores de la matriz hasta este punto. De esta forma, puede asignar 1-100 a 1-10.

Aunque lo anterior sería un uso horrible de esta técnica, puede ver fácilmente cómo puede con un poco de creatividad crear sus propias distribuciones no uniformes. Por ejemplo consideran:

1,2,4,8,16,16,8,4,2,1

Los 10 elementos anteriores suman 64 y así serían muy adecuado para la cartografía 64 a 10 (Esto es solo una ilustración). Las implementaciones que he visto desean tener la distribución siempre suman un número particular, pero si encapsula obtener un número aleatorio del 1-10, entonces puede tener distribuciones que sumen de manera diferente.

Al crear solo unas pocas distribuciones de este tipo, puede crear muchas distribuciones sensatas al sumar los vectores de probabilidad (considere una distribución altamente localizada en 3 y una distribución altamente localizada alrededor de 8, quizás sea el último zombie slasher y los zombis amantes de todos votó 8 porque a medida que las películas de zombis se van fue bastante buena y el resto de la película en público votó 3 porque ... en general, es menos desagradable).

Cuestiones relacionadas