Pregunta

Tengo una tabla en mi base de datos con una lista de las personas. Necesito crear una lista de amigos al azar todos los días.

La idea es que cada día cada persona está emparejado con una persona al azar diferente para ese día.

Desde la mesa puede ser muy grande Me preguntaba cuál sería la mejor manera de hacer tal cosa?

He pensado en 2 ideas, pero no estoy tan seguro acerca de ellos en cuanto a rendimiento.

1) uso un generador de números aleatorios para recoger al azar dos ID. El problema con esto es que tengo que hacer constantemente de que los números no fueron llamados todavía y como llegue cerca del final de la lista Esto puede ser muy lento.

2) iniciar cada uno con el chico por debajo de ellos en la lista y simplemente mover hacia abajo una cada día hasta llegar a la parte inferior en el punto que se agradece vuelvo a la parte superior.

¿Alguna otra idea?

Gracias

¿Fue útil?

Solución

Tal vez se puede hacer una consulta que ordena la tabla al azar, y luego simplemente emparejar la gente de arriba hacia abajo. La primera entrada se combina con el segundo, tercero con el cuarto y así sucesivamente.

ejemplo de SQL Server:

SELECT * FROM Table ORDER BY NEWID()

Otros consejos

En realidad no es tan difícil, utilizando una muestra aleatoria-generador no es muy lento, pero si eres muy mala suerte la complejidad del tiempo se convertirá en O (n ^ 2) y en el mejor de los casos O (1), ¿Qué le parece que ?

Sin embargo, sólo tiene una tabla que conecta dos personas, ver si sus identificadores occure que es rápido, si no lo hace, sólo tiene que añadir sus identificaciones, utilizar T-SQL para soltar las conexiones adicionales.

Me parece que este problema ya está resuelto.

  1. ¿Quieres hacer listas de pares.
  2. ¿Quiere todas las listas de pares (uno para cada día)

No es necesario utilizar una función aleatoria para esto. Sólo tiene que generar todas las listas de pares.

El href="http://en.wikipedia.org/wiki/Permutation" rel="nofollow noreferrer"> Permutación página

#!/usr/bin/perl -w
use strict;
use warnings;
use Data::Dumper;

sub permutation {
    my ($k, $s) = @_;

    for my $j (1..(@$s-1)) {
        my $n = ($k % $j) + 1;
        ($s->[$n], $s->[$j]) = ($s->[$j], $s->[$n]);
        $k = int($k / $j);
    }
    return $s;
}

for (1..3) {
    my $s = permutation($_, [1,2,3,4]);
    my ($a, $b, $c, $d) = @$s;
    print "$a\t$b\n";
    print "$c\t$d\n";
    print "------\n";
}
scroll top