C#에서 임의의 커플 생성
-
05-09-2019 - |
문제
DB에 사람들의 목록이있는 테이블이 있습니다. 매일 임의의 친구 목록을 만들어야합니다.
아이디어는 매일 모든 사람이 그날 다른 임의의 사람과 짝을 이루는 것입니다.
테이블이 매우 커질 수 있으므로 그런 일을하는 가장 좋은 방법이 무엇인지 궁금했습니다.
나는 두 가지 아이디어를 생각했지만 성능과 관련하여 그들에 대해 확신하지 못합니다.
1) 난수 생성기를 사용하여 무작위로 두 개의 ID를 선택합니다. 그 문제는 끊임없이 숫자를 호출하지 않았는지 확인해야하며 목록의 끝에 가까워지면 실제로 느리게 될 수 있다는 것입니다.
2) 목록에서 아래의 남자와 함께 모든 사람을 시작하고 내가 맨 위로 돌아갈 때까지 매일 하루를 내려갑니다.
다른 아이디어가 있습니까?
감사
해결책
아마도 테이블을 무작위로 정렬 한 쿼리를 만들고 사람들을 상단에서 짝을 이룰 수 있습니다. 첫 번째 항목은 두 번째 항목, 세 번째는 네 번째 등과 짝을 이룹니다.
SQL Server 예 :
SELECT * FROM Table ORDER BY NEWID()
다른 팁
무작위 제너레이터를 사용하는 것은 실제로 속도가 느리지 않지만 매우 운이 좋지 않으면 시간 복잡성이 O (n^2)가되고 최선의 경우 O (1)이되는 것은 어떻습니까?
그러나 두 사람을 연결하는 테이블 만 있으면 ID가 빠르지 않은지 확인하지 않으면 신분증을 추가하고 T-SQL을 사용하여 추가 연결을 느슨하게하십시오.
이 문제는 이미 해결 된 것 같습니다.
- 쌍 목록을 만들고 싶습니다.
- 당신은 모든 쌍 목록을 원합니다 (매일 하나)
이를 위해 임의의 기능을 사용할 필요가 없습니다. 모든 쌍 목록을 생성하면됩니다.
그만큼 순열 Wikipedia의 페이지에는 사용해야 할 알고리즘의 몇 가지 구현이 포함되어 있습니다.
#!/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";
}