Domanda

Ho una tabella nel mio DB con una lista di persone. Ho bisogno di creare una lista di amici casuali ogni giorno.

L'idea è che ogni giorno ogni persona è accoppiato con una persona a caso diverso per quel giorno.

Dato che la tabella può diventare molto grande mi chiedevo quale sarebbe il modo migliore per fare una cosa simile?

Ho pensato di 2 idee, ma io non sono così sicuro su di loro in termini di prestazioni.

1) Uso un generatore di numeri casuali per selezionare casualmente due ids. Il problema di questo è che devo fare costantemente che i numeri non erano ancora chiamato e come mi avvicino alla fine della lista questo può ottenere molto lentamente.

2) avviare tutti fuori con il ragazzo sotto di loro nella lista e semplicemente spostare verso il basso uno ogni giorno fino ad arrivare fino in fondo al punto pagherei mi sposto di nuovo verso l'alto.

Tutte le altre idee?

Grazie

È stato utile?

Soluzione

Forse si può fare una query che ordina la tavola in modo casuale, e poi basta abbinare le persone dall'alto verso il basso. La prima voce viene accoppiato con il secondo, il terzo con il quarto e così via.

esempio SQL Server:

SELECT * FROM Table ORDER BY NEWID()

Altri suggerimenti

Non è poi così difficile, usando una casuale generatore non è molto lento, ma se siete molto sfortunato la complessità tempo diventerà O (n ^ 2), in caso migliore O (1), come si fa in quel modo ?

Tuttavia, basta avere una tabella che collega due persone, per vedere se il loro ID occure che è veloce, se ciò non avviene, è sufficiente aggiungere il loro ID, usa T-SQL di perdere i collegamenti aggiuntivi.

Mi sembra che questo problema è già risolto.

  1. Si vuole fare liste di coppie.
  2. Si desidera che tutti gli elenchi delle coppie (uno per ogni giorno)

Non è necessario utilizzare una funzione random per questo. Hai solo bisogno di generare tutte le liste di coppie.

Il href="http://en.wikipedia.org/wiki/Permutation" rel="nofollow noreferrer"> permutazione

#!/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