2011-12-22 18 views
28

मेरे दोस्तों ने मुझे गुप्त सांता के खेल खेलने के लिए घर आमंत्रित किया, जहां हमें बहुत सारे & समूह में किसी मित्र के लिए 'सांता' की भूमिका निभाते हैं।गुप्त सांता - 'वैध' क्रमपरिवर्तन उत्पन्न करना

तो, हम अपने सभी नाम लिखते हैं और नाम यादृच्छिक रूप से चुनते हैं। यदि हम में से कोई भी अपना नाम उठाकर समाप्त होता है, तो हम फिर से नाम बदलते हैं और नाम चुनते हैं (तर्क यह है कि कोई व्यक्ति स्वयं का सांता नहीं हो सकता है)।

खेलते समय हम में से सात हैं इसलिए मैंने कुछ प्रतिबंधों के साथ (1: 7) के क्रमपरिवर्तन के रूप में अंतिम 'सांता-आवंटन' के बारे में सोचा।

मैं कैसे हम विशेष रूप से या किसी भी प्रोग्रामिंग भाषा या यहां तक ​​कि एक एल्गोरिथ्म में मेथेमेटिका इस्तेमाल कर सकते हैं के बारे में विभिन्न विचारों आमंत्रित करना चाहते हैं:

  • सूची/प्रिंट आउट सभी 'वैध' सांता-आवंटन
  • के रूप में 'गुप्त सांता' खेल रहे हैं दोस्तों की संख्या बढ़ती है
+2

अज्ञानता को क्षमा करें, लेकिन क्या यह 7 को हल नहीं करता है! ? संभावनाओं की संख्या है। उन की सटीक सामग्री नहीं है। – Sheriff

+3

@ शेरिफ नहीं, यह नहीं है। वह उन क्रमिकताओं के लिए पूछ रहा है जो जगह में कोई तत्व नहीं छोड़ते हैं। तीन तत्वों के लिए, (123) (132) (321) (213) अस्वीकार कर दिए गए हैं, (231) और (312) ठीक हैं। – Szabolcs

+1

@ शेरिफ, हाँ, वास्तव में बहुत कुछ। एन!क्रमपरिवर्तन की कुल संख्या होगी, लेकिन उनमें से कुछ 'अमान्य' होंगे और विचार करने की आवश्यकता होगी। सरल नियम यह है कि यदि व्यक्ति 'मैं' 'I' चुनता है तो यह 'क्रमपरिवर्तन' अमान्य है। यदि 1,2,3, .. n लोग हैं और पी (1), पी (2) .. पी (एन) वे स्लॉट हैं जिन्हें वे चुनते हैं, फिर प्रत्येक 1 <= i <= n के लिए, मुझे नहीं करना चाहिए पी (i) के बराबर हो। मुझे पता है कि यह काफी सरल स्थिति है, लेकिन मैं गणित में कहने वाले विभिन्न 'मुहावरे' सीखने के लिए उत्सुक हूं, यह गणित में कहें ... और देखें कि क्या हम कुछ दिलचस्प सरलीकरण/पैटर्न ढूंढ सकते हैं ... – fritz

उत्तर

15

मैं इस प्रस्ताव:

f[s_List] := Pick[#, Inner[SameQ, #, s, Nor]] & @ [email protected] 

f @ Range @ 4 
{{2, 1, 4, 3}, {2, 3, 4, 1}, {2, 4, 1, 3}, {3, 1, 4, 2}, {3, 4, 1, 2}, 
{3, 4, 2, 1}, {4, 1, 2, 3}, {4, 3, 1, 2}, {4, 3, 2, 1}}

यह हीके के समारोह की तुलना में काफी तेज है।

f @ Range @ 9; //Timing 
secretSanta[9]; //Timing 
{0.483, Null}
{1.482, Null}

कोड की पारदर्शिता की अनदेखी करते हुए कई बार तेजी से अभी भी बनाया जा सकता है:

f2[n_Integer] := With[{s = [email protected]}, 
    # ~Extract~ 
     SparseArray[[email protected]@BitXor[s, #] & /@ #]["NonzeroPositions"] & @ [email protected] 
    ] 

f2[9]; //Timing 
{0.162, Null}
+1

(1) मुझे एक झटका था कि स्पैसएरे का उपयोग इस गति को करने के लिए किया जा सकता था। अच्छा काम। (2) इसके लायक होने के लिए, एक अंतर्निहित फ़ंक्शन होने के लिए (प्रकट होता है) जो 'व्यंग्य' की * संख्या * दे सकता है, लेकिन वास्तविक रूप से वास्तविक 'अपमान' नहीं। 'सबफैक्टोरियल' फ़ंक्शन देखें। – telefunkenvf14

+2

धन्यवाद इन 2 'रत्न' @ श्री विज़ार्ड, मैं भी स्पैर्सएरे के उपयोग से प्यार करता था - मुझे वास्तव में इतना सीखना है, इस खेल के लिए धन्यवाद! :) मुबारक छुट्टियां और सभी के लिए एक आश्चर्यजनक नया साल ..! – fritz

13

मेथेमेटिका में आप

secretSanta[n_] := 
    DeleteCases[Permutations[Range[n]], a_ /; Count[a - Range[n], 0] > 0] 
की तरह कुछ कर सकता है स्केलेबल है

जहां n पूल में लोगों की संख्या है। तो उदाहरण के लिए secretSanta[4] रिटर्न

{{2, 1, 4, 3}, {2, 3, 4, 1}, {2, 4, 1, 3}, {3, 1, 4, 2}, {3, 4, 1, 2}, 
    {3, 4, 2, 1}, {4, 1, 2, 3}, {4, 3, 1, 2}, {4, 3, 2, 1}} 

संपादित

यह मेथेमेटिका में Combinatorica पैकेज की तरह दिखता है वास्तव में, एक Derangements कार्य है ताकि आप भी तरह

Needs["Combinatorica`"] 
Derangements[Range[n]] 

हालांकि पर कुछ कर सकते हैं मेरे सिस्टम Derangements[Range[n]] ऊपर दिए गए फ़ंक्शन की तुलना में एक कारक 2 धीमा है।

+1

आपका फ़ंक्शन अधिक संक्षेप में लिखा जा सकता है: 'गुप्त सांता [n_]: = मामले [क्रमपरिवर्तन @ रेंज @ एन, ए_ /; फ्रीक्यू [ए - रेंज [एन], 0]] ' –

29

जो आप खोज रहे हैं उसे derangement (एक और प्यारा लेटिनेट शब्द पता है, जैसे exsanguination और defenestration) कहा जाता है।

सभी क्रमिक क्रमों का अंश 1/ई = लगभग 36.8% तक पहुंचता है - इसलिए यदि आप यादृच्छिक क्रमपरिवर्तन उत्पन्न कर रहे हैं, तो बस उन्हें उत्पन्न करते रहें, और एक बहुत अधिक संभावना है कि आपको 5 में से कोई एक मिलेगा या एक यादृच्छिक क्रमपरिवर्तन के 10 चयन।

This presentation बहुत नीचे करने वाली पृथ्वी है (10.1% एक 5 के भीतर यादृच्छिक क्रमपरिवर्तन, हर अतिरिक्त 5 क्रमपरिवर्तन नहीं मिल की संभावना 10 का एक और पहलू से एक गड़बड़ी नहीं मिल की संभावना को कम करती है) और पैदा करने के लिए पुनरावर्ती एल्गोरिदम देता है क्रमिकता को अस्वीकार करने के बजाय सीधे अपमान, जो अपमान नहीं हैं।

+2

कीवर्ड देने के लिए +1 मैं Google को नहीं कर सका: अपमान! – Szabolcs

+2

दरअसल, यह एक सुखद परिचय था जो मुझे स्टैक-ओवर-फ्लो के समुदाय में लाता है ...! मैंने कभी नहीं सोचा था कि एक विशेष शब्द फेर था जैसे 'डरावना, और मूर्ख' (जैसा कि मेरे दोस्तों को शायद लगा ?!) विचार मैं पीछा करने पर नरक था ... धन्यवाद एक टन तुरंत मदद .. – fritz

+0

@fritz StackOverflow में आपका स्वागत है, और प्रश्न के उत्तर को स्वीकार करना न भूलें (यदि कोई उपयुक्त है!) :-) – Szabolcs

15

एक क्रमपरिवर्तन जो स्वयं के लिए कोई तत्व नहीं है derangement है। चूंकि एन बढ़ता है, अपमान का अंश स्थिर 1/ई तक पहुंचता है। इस तरह, यह यादृच्छिक रूप से क्रमपरिवर्तन चुनते समय, (औसत पर) लेता है और एक अपमान प्राप्त करने का प्रयास करता है।

विकिपीडिया आलेख में छोटे एन के लिए स्पष्ट मानों की गणना करने के लिए अभिव्यक्तियां शामिल हैं।

+1

इस जानकारी के लिए बहुत बहुत धन्यवाद ..! हालांकि यह कुल एन से कुछ क्रमपरिवर्तनों का एक छोटा 'फ़िल्टरिंग' प्रतीत होता है! व्यवस्था, मुझे कुछ अंतर्ज्ञान था कि इसमें कुछ 'पैटर्न' होना चाहिए ...! :) मैं मैथमैटिका में अपमानजनक 'गणना' के कुछ तरीकों को लागू करने और अन्वेषण करने का प्रयास करूंगा ..! बहुत बहुत धन्यवाद ..! – fritz

+0

@wnoise - आप बताते हैं कि एन बढ़ता है, "... अपमान का अंश निरंतर 1/ई तक पहुंचता है।" यह मुझे 'सचिव समस्याओं' नामक इष्टतम रोक/खोज समस्याओं की एक सामान्य श्रेणी की याद दिलाता है, जहां वही 1/ई परिणाम फसलों को ऊपर उठाता है। यदि परिचित है, तो क्या आप अपमान और 'सचिव समस्या' के बीच संबंधों पर टिप्पणी कर सकते हैं? (मुझे लगता है कि स्टैक ब्रह्मांड में औपचारिक रूप से कहीं भी यह एक अच्छा सवाल होगा, लेकिन शायद एसओ पर नहीं। अगर विचारयोग्य है और यहां उत्तर देने का समय कचरा होगा तो उसे विचार करें।) – telefunkenvf14

+0

@ telefunkenvf14: I "सचिव समस्याओं" के बारे में कभी नहीं सुना है, इसलिए टिप्पणी नहीं कर सका। – wnoise

1

मैं निर्मित दस्तावेज में Subfactorial समारोह और में आए उदाहरण के लिए उदाहरणों में से एक को बदल दिया:

Remove[teleSecretSanta]; 
teleSecretSanta[dims_Integer] := 
With[{spec = Range[dims]}, 
    With[{ 
    perms = Permutations[spec], 
    casesToDelete = DiagonalMatrix[spec] /. {0 -> _}}, 
    DeleteCases[perms, Alternatives @@ casesToDelete] 
    ] 
    ] 

कोई फ़ंक्शन देखने के लिए Subfactorial का उपयोग कर सकता है।

Length[teleSecretSanta[4]] == Subfactorial[4] 

Mr.Wizard के जवाब के रूप में, मैं teleSecretSanta SparseArray के माध्यम से अनुकूलित किया जा सकता है पर शक। हालांकि, इस तरह के शेंगेनियों का प्रयास करने के लिए मैं इस समय बहुत नशे में हूं। (मजाक कर रहा हूँ ... मैं वास्तव में बहुत आलसी और बेवकूफ हूं।)

2

यह मान्य अपमानों की गिनती के बारे में आपके प्रश्न का उत्तर नहीं देता है, लेकिन यह निम्नलिखित के साथ एक उत्पन्न करने के लिए एक एल्गोरिदम देता है (जो आप चाहते हैं) गुण:

  1. यह guaranties सांता संबंध में एक भी चक्र है कि वहाँ (यदि आप 4 में खेलते हैं, आप 2 सांता जोड़ों के साथ अंत नहीं है -> 2 चक्र),
  2. तो यह और भी साथ कुशलता से काम करता है प्लेयर की बहुत बड़ी संख्या,
  3. यदि उचित रूप से लागू किया गया है, तो कोई भी नहीं जानता कि किसका सांता,
  4. इसे कंप्यूटर की आवश्यकता नहीं है, केवल कुछ पेपर।

यहाँ एल्गोरिथ्म:

  • हर खिलाड़ी को एक लिफाफे पर उसे/उसके नाम लिखते हैं और एक मुड़ा हुआ कागज में उसके/उसका नाम डालता लिफाफे में।
  • एक भरोसेमंद खिलाड़ी (उपरोक्त संपत्ति # 3 के लिए) सभी लिफाफे लेता है और उन्हें अपनी पिछली तरफ देखता है (जहां कोई नाम लिखा नहीं जाता है)।
  • एक बार लिफाफे काफी अच्छी तरह से घुमाए जाते हैं, हमेशा पीछे की ओर देखते हैं, भरोसेमंद खिलाड़ी पेपर को प्रत्येक लिफाफे में निम्नलिखित में ले जाता है।
  • लिफाफे को फिर से घुमाने के बाद, लिफाफे उस खिलाड़ी को वापस वितरित किए जाते हैं जिसका नाम उनके ऊपर है, और प्रत्येक खिलाड़ी उस व्यक्ति का सांता है जिसका नाम लिफाफा में है।
संबंधित मुद्दे