【问题标题】:Generating random couples in C#在 C# 中生成随机对
【发布时间】:2009-05-26 07:51:40
【问题描述】:

我的数据库中有一张包含人员列表的表格。我需要每天创建一个随机好友列表。

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

由于桌子可能会变得非常大,我想知道做这种事情的最佳方法是什么?

我想到了 2 个想法,但我对它们的性能不太确定。

1) 我使用随机数生成器随机选择两个 id。这样做的问题是我必须不断确保数字还没有被调用,当我接近列表的末尾时,这可能会变得非常慢。

2) 从列表中他们下面的人开始,然后每天简单地向下移动一个,直到你到达底部,然后我又回到顶部。

还有其他想法吗?

谢谢

【问题讨论】:

    标签: c# performance random combinations


    【解决方案1】:

    也许您可以进行一个随机排序表的查询,然后从上到下将人员配对。第一个条目与第二个配对,第三个与第四个配对,依此类推。

    SQL Server 示例:

    SELECT * FROM Table ORDER BY NEWID()
    

    【讨论】:

    • 这是一个非常聪明的解决方案。以随机排序的顺序抓取整个列表,然后 for(int i =0; i
    • 很好的解决方案,但如果这是一项要求,它允许连续两天拥有相同的一对(在这种情况下,无论如何都必须保留历史记录)
    • 谢谢,效果很好。我使用 Linq OrderBy(x => random.GetNext());
    【解决方案2】:

    这并不难,使用随机生成器并不是很慢,但如果你很不幸,时间复杂度将变为 O(n^2),最好是 O(1),你觉得怎么样?

    但是,只要有一个表,连接两个人,看看他们的 ID 是否出现很快,如果没有,只需添加他们的 ID,使用 T-SQL 释放额外的连接。

    【讨论】:

      【解决方案3】:

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

      1. 您想要制作成对列表。
      2. 您想要所有配对列表(每天一个)

      您不需要为此使用随机函数。您只需要生成所有对列表。

      Wikipedia 上的 Permutation 页面包含一些您需要使用的算法实现。

      #!/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";
      }
      

      【讨论】:

      • 您可能仍想采用随机排列。对于超过少数项目的列表,生成每个排列可能有点过分:)
      • 最后一个for循环中的数字可以是随机数。这样你就会得到一个随机排列。
      • 例如 permutation(6, $people) 将返回列表的第六个排列。选择另一个(随机)数字将生成不同的对列表。
      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2023-03-11
      相关资源
      最近更新 更多