Генерация случайных пар в C # - PullRequest
1 голос
/ 26 мая 2009

В моей БД есть таблица со списком людей. Мне нужно каждый день создавать список случайных друзей.

Идея состоит в том, что каждый день в этот день каждый человек соединяется с другим случайным человеком.

Поскольку стол может стать очень большим, мне было интересно, как лучше всего это сделать?

Я подумал о двух идеях, но я не очень уверен в них относительно производительности.

1) Я использую генератор случайных чисел, чтобы случайным образом выбрать два идентификатора. Проблема в том, что я должен постоянно следить за тем, чтобы номера еще не звонили, и по мере приближения к концу списка это может стать очень медленным.

2) начинайте все с парня под ним в списке и просто двигайтесь вниз по одному каждый день, пока не дойдете до дна, в котором я и вернусь к вершине.

Есть еще идеи?

Спасибо

Ответы [ 3 ]

7 голосов
/ 26 мая 2009

Возможно, вы можете сделать запрос, который сортирует таблицу случайным образом, а затем просто соединить людей сверху вниз. Первая запись соединяется со второй, третья с четвертой и т. Д.

Пример SQL Server:

SELECT * FROM Table ORDER BY NEWID()
1 голос
/ 26 мая 2009

Это не так уж сложно, использование генератора случайных чисел не очень медленно, но если вам очень не повезет, сложность времени станет O (n ^ 2) и в лучшем случае O (1), как вам это понравится

Однако, просто имейте таблицу, которая соединяет двух человек, посмотрите, происходят ли их идентификаторы, что быстро, если нет, просто добавьте их идентификаторы, используйте T-SQL, чтобы потерять дополнительные соединения.

0 голосов
/ 26 мая 2009

Мне кажется, эта проблема уже решена.

  1. Вы хотите составить списки пар.
  2. Вам нужны все списки пар (по одному на каждый день)

Вам не нужно использовать случайную функцию для этого. Вам просто нужно сгенерировать все списки пар.

Страница Перестановка в Википедии содержит несколько реализаций алгоритма, который вам нужно использовать.

#!/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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...