Question

J'ai une table dans ma base de données avec une liste de personnes. Je dois créer une liste de copains au hasard chaque jour.

L'idée est que chaque jour chaque personne est jumelé à une autre personne au hasard pour ce jour-là.

Étant donné que la table peut être très grand, je me demandais quelle serait la meilleure façon de faire une telle chose?

Je l'ai pensé à 2 idées mais je ne suis pas si sûr d'eux en ce qui concerne la performance.

1) J'utilise un générateur de nombres aléatoires pour choisir au hasard deux ids. Le problème avec cela est que je dois faire constamment que les chiffres étaient pas encore appelé et que je reçois près de la fin de la liste cela peut obtenir très lentement.

2) commencent tous au large avec le gars en dessous d'eux dans la liste et simplement déplacer vers le bas un chaque jour jusqu'à ce que vous obtenez au fond au point whcih je recule vers le haut.

D'autres idées?

Merci

Était-ce utile?

La solution

Peut-être que vous pouvez faire une requête qui trie la table au hasard, puis Couplez les gens de haut en bas. La première entrée se jumelé avec le deuxième, troisième avec la quatrième et ainsi de suite.

Exemple SQL Server:

SELECT * FROM Table ORDER BY NEWID()

Autres conseils

Il est pas vraiment difficile, en utilisant un générateur aléatoire est pas vraiment lent, mais si vous êtes très malchanceux la complexité du temps deviendront O (n ^ 2) et dans le meilleur des cas O (1), comment voulez-vous comme ça ?

Cependant, ont juste une table qui relie deux personnes, voir si leurs papiers d'identité occure qui est rapide, si elle ne veut pas, il suffit d'ajouter leur carte d'identité de, utilisez T-SQL pour perdre des connexions supplémentaires.

Il me semble que ce problème est déjà résolu.

  1. Vous voulez faire des listes de paires.
  2. Vous voulez toutes les listes de paires (un pour chaque jour)

Vous n'avez pas besoin d'utiliser une fonction aléatoire pour cela. Vous avez juste besoin de générer toutes les listes de paires.

La page Permutation sur Wikipédia contient quelques implémentations de l'algorithme que vous devez utiliser .

#!/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";
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top