我有一个表在我的数据库与人的名单。我需要创建每天随机好友列表。

的想法是,每天每个人都与不同的随机人的那一天配对。

由于该表可能会非常大,我想知道什么是做这种事的最好办法?

我已经想到了2个想法,但我不这么肯定他们在性能方面。

1)I使用一个随机数发生器随机地选择两个标识。但问题是,我必须不断地确保数字是没有打电话,因为我去接近列表的末尾这样可以得到真正的慢。

2)与列表中它们下面的家伙开始每一个关闭,只需每天向下移动一个,直到你在whcih点底部我搬回到顶部。

任何其他的想法?

由于

有帮助吗?

解决方案

也许你可以作出这样的随机排序表的查询,然后只配对的人从上往下。的第一个条目被配对与所述第二,第三与第四等。

SQL Server的示例:

SELECT * FROM Table ORDER BY NEWID()

其他提示

这不是真的那么难,使用随机生成器是不是很慢,但如果你是非常不吉利的时间复杂度将成为为O(n ^ 2),在最好的情况下O(1),你怎么这样?

然而,仅仅有一个连接两个人一表,看看它们的ID occure这是快,如果它不,只需添加相应的ID,使用T-SQL松动额外的连接。

在我看来,这个问题已经解决了。

  1. 您想使对名单。
  2. 您想对所有的列表(一个用于每一天)
  3. 您不需要使用随机函数这一点。你只需要生成对所有列表。

    置换的维基百科页面包含您需要使用算法的几种实现

    #!/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";
    }
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top