Generazione di coppie casuali in C #
-
05-09-2019 - |
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
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.
- Si vuole fare liste di coppie.
- 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";
}