سؤال

لدي جدول في DB مع قائمة الأشخاص. أحتاج إلى إنشاء قائمة من الأصدقاء العشوائيين كل يوم.

الفكرة هي أن كل يوم يتم إقران كل شخص شخص عشوائي مختلف لهذا اليوم.

نظرا لأن الجدول قد يحصل على كبير جدا، كنت أتساءل ما سيكون أفضل طريقة للقيام بهذا الشيء؟

لقد فكرت في أفكارين، لكنني لست متأكدا منهم فيما يتعلق بالأداء.

1) استخدم مولد أرقام عشوائي للاختيار عشوائيا معرفتين. المشكلة في ذلك هي أنه يجب أن أتأكد باستمرار من أن الأرقام لم يتم استدعاؤها بعد وأصبحت بالقرب من نهاية القائمة، يمكن أن تصبح هذه بطيئة حقيقية.

2) ابدأ كل مرة مع الرجل تحتها في القائمة وبما هو مجرد الانتقال إلى أسفل واحد كل يوم حتى تصل إلى الأسفل في نقطة whcih أعود إلى الأعلى.

أي أفكار أخرى؟

شكرا

هل كانت مفيدة؟

المحلول

ربما يمكنك إجراء استعلام يقوم بفرز الجدول بشكل عشوائي، ثم قم بإقران الأشخاص من أعلى إلى أسفل. يتم إقران الإدخال الأول بالثاني والثالث مع الرابع وما إلى ذلك.

مثال SQL Server:

SELECT * FROM Table ORDER BY NEWID()

نصائح أخرى

ليس الأمر صعبا حقا، باستخدام مولد عشوائي ليس بطيئا حقا ولكن إذا كنت سيئك للغاية، فسوف تصبح تعقيد الوقت س (n ^ 2) وفي أفضل الأحوال O (1)، كيف تحب ذلك؟

ومع ذلك، فقط يكون لديك جدول يربط شخصين، معرفة ما إذا كانت معرفاتهم تحدث سريعة، إذا لم تكن كذلك، فما عليك سوى إضافة معرفها، استخدم T-SQL إلى اتصالات إضافية فضفاضة.

يبدو لي أن هذه المشكلة تم حلها بالفعل.

  1. تريد إجراء قوائم من أزواج.
  2. تريد جميع قوائم أزواج (واحدة لكل يوم)

لا تحتاج إلى استخدام وظيفة عشوائية لهذا. تحتاج فقط إلى توليد جميع قوائم أزواج.

ال التقليب تحتوي الصفحة على 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";
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top