سؤال

ما هي أسهل طريقة لإعادة صفيف بترتيب عشوائي في روبي؟ أي شيء جميل وقصير يمكن استخدامه في جلسة IRB مثل

[1,2,3,4,5].random()
# or 
random_sort([1,2,3,4,5])
هل كانت مفيدة؟

المحلول

إذا لم يكن لديك [] .shuffle ، [] .SORT_BY يستبدل كل عنصر مؤقتًا عن طريق شيء لغرض الفرز ، في هذه الحالة ، رقم عشوائي.

] بعض اللغات (على سبيل المثال بعض تطبيقات JavaScript) لا تقوم بخلط المصفوفات بشكل صحيح إذا قمت بعمل نوع عشوائي على الصفيف ، مع عواقب عامة في بعض الأحيان.

تحليل JS (مع الرسوم البيانية!): http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html

روبي لا يختلف! لديها نفس المشكلة. قون

#sort a bunch of small arrays by rand-0.5
a=[]
100000.times{a <<  [0,1,2,3,4].sort{rand-0.5}}

#count how many times each number occurs in each position
b=[]
a.each do |x|
    x.each_index do |i|
        b[i] ||=[]
        b[i][x[i]] ||= 0
        b[i][x[i]] += 1
    end
end
p b

=>

[[22336, 18872, 14814, 21645, 22333],
 [17827, 25005, 20418, 18932, 17818],
 [19665, 15726, 29575, 15522, 19512],
 [18075, 18785, 20283, 24931, 17926],
 [22097, 21612, 14910, 18970, 22411]]

يجب أن يحدث كل عنصر في كل موقف حوالي 20000 مرة. [] .SORT_BY (RAND) يعطي نتائج أفضل بكثير.

#sort with elements first mapped to random numbers
a=[]
100000.times{a <<  [0,1,2,3,4].sort_by{rand}}

#count how many times each number occurs in each position
...

=>

[[19913, 20074, 20148, 19974, 19891],
 [19975, 19918, 20024, 20030, 20053],
 [20028, 20061, 19914, 20088, 19909],
 [20099, 19882, 19871, 19965, 20183],
 [19985, 20065, 20043, 19943, 19964]]

وبالمثل لـ [

[[20011, 19881, 20222, 19961, 19925],
 [19966, 20199, 20015, 19880, 19940],
 [20062, 19894, 20065, 19965, 20014],
 [19970, 20064, 19851, 20043, 20072],
 [19991, 19962, 19847, 20151, 20049]]

نصائح أخرى

array.shuffle

ماذا عن هذا؟

أساليب المساعد لـ Enumerform ، Array ، التجزئة ، والسلسلة التي تتيح لك اختيار عنصر عشوائي أو خلط ترتيب العناصر.

http://raa.ruby-lang.org/project/rand/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top