2014-10-14 5 views
8

मैं ग्रोवी में भारित लॉटरी लागू कर रहा हूं। यह कुछ प्रतिभागियों को दूसरों की तुलना में जीतने का बेहतर मौका देता है (मूल रूप से बिल्कुल एनबीए ड्राफ्ट की तरह)। यह प्रत्येक प्रतिभागी को एक सरणी में फेंककर काम करता है एन बार जहां एन जीतने की संभावनाओं की संख्या है। फिर यह उस सरणी से एक यादृच्छिक अनुक्रमणिका चुनता है।ग्रोवी प्राथमिकता अंक

एक अच्छे छोटे कोडर की तरह, मैंने एक परीक्षण लिखा था। यह समूह से 100 बार विजेता चुनता है और आउटपुट करता है कि प्रत्येक प्रतिभागी को कितनी बार चुना गया था। उम्मीद है कि यह मोटे तौर पर इस बात के अनुरूप होगा कि उन्हें कितनी बार चुना जाना चाहिए (उनकी संभावनाओं के आधार पर)। परिणाम थे ... बंद।

मैंने इस मुद्दे को एक पंक्ति में संकुचित कर दिया है, यदि 2 अलग-अलग बयानों में विभाजित है, तो पूरी तरह से काम करता है। दिनचर्या का एक पतला संस्करण नीचे है। "बुरा" संस्करण सक्रिय है और "अच्छा संस्करण" पर टिप्पणी की है

def randomInRange(int min, int max) { 
     Random rand = new Random() 
     rand.nextInt((max - min) + 1) + min 
} 

def bob = [name:'bob', timesPicked:0] 
def joe = [name:'joe', timesPicked:0] 
def don = [name:'don', timesPicked:0] 

def chanceWheel = [] 

//don should get picked a lot more 
2.times{chanceWheel << bob} 
2.times{chanceWheel << joe} 
6.times{chanceWheel << don} 

//pick somebody at random from the chance wheel 
100.times{ 
    //this will produce timesPicked counts that do NOT sum to 100 and usually under-represents don 
    chanceWheel[randomInRange(0,9)].timesPicked++ 

    //splitting the logic into 2 lines will always have the correct sum of timesPicked with roughly the right distribution of winners 
    //def picked = chanceWheel[randomInRange(0,9)] 
    //picked.timesPicked++ 
} 

println bob 
println joe 
println don 

मेरा प्रश्न क्या एक लाइनर संस्करण के साथ गलत है? मेरा अनुमान है कि यह निष्पादन के मुद्दे का एक आदेश है, लेकिन मैं अपने आंकड़े के जीवन के लिए नहीं कर सकता जहां यह रेल से निकल रहा है।

+3

'मौकाहेल [randomInRange (0,9)]। TimesPicked ++' मौका है [यादृच्छिकInRange (0,9)]। TimesPicked = chanceWheel [randomInRange (0,9)]। TimesPicked + 1' जो यादृच्छिक रूप से दो बार रेंज याद करता है कामकाजी उदाहरण के लिए जहां इसे एक बार कहा जाता है और एक चर के लिए आवंटित किया जाता है। ;) – dmahapatro

+0

अहह। तो अनिवार्य रूप से मुद्दा यह है कि एक प्रतिभागी के समय में चुना नहीं जा रहा है। इसे किसी अन्य यादृच्छिक प्रतिभागी के समय से ओवरराइट किया जा रहा है (इसे बढ़ाए जाने के बाद)। मैंने लूप के अंदर वर्तमान पिक गिनती को डंप करके इसका परीक्षण किया और यह देख सकता है कि यह व्यवहार हो रहा है। धन्यवाद श्रीमान –

+0

आप '[] 'से' random_Range()' को 'var' में एक var में भी स्थानांतरित कर सकते हैं। फिर भी यह यहां उत्पन्न कोड में एक त्रुटि की तरह दिखता है। या यह जावा व्यवहार है? – cfrick

उत्तर

3
chanceWheel[randomInRange(0,9)].timesPicked++ 

chanceWheel[randomInRange(0,9)].timesPicked = 
    chanceWheel[randomInRange(0,9)].timesPicked + 1 

जो काम उदाहरण है, जहां यह एक बार कहा जाता है और एक चर को असाइन किया गया के विपरीत दो बार randomRange() कॉल है।