2010-12-30 11 views
5

मेरे पास एक मूवी डेटाबेस है जहां मुझे डेटा के साथ पॉप्युलेट करने की आवश्यकता है ताकि एप्लिकेशन का परीक्षण और विकास करना आसान हो जाए। फिल्म रेटिंग और उपयोगकर्ता खातों को पकड़ने के लिए टेबल हैं, उपयोगकर्ता मूवीज़ रेट करते हैं।यथार्थवादी रेटिंग के लिए 1 और 10 के बीच मूल्यों को यादृच्छिक कैसे करें?

मैंने नकली और जेनेरिक डेटा के साथ डेटाबेस को पॉप्युलेट करने के लिए एक स्क्रिप्ट विकसित करना शुरू कर दिया है, लेकिन मुझे नहीं पता कि रेटिंग को यादृच्छिक कैसे करें। प्रत्येक फिल्म के लिए मैं यादृच्छिक संख्या उपयोगकर्ताओं, 100, 500, 1000, जो कुछ भी चुनता हूं। और उन सभी उपयोगकर्ताओं के लिए मैं 1 से 10 तक रेटिंग को यादृच्छिक बना देता हूं लेकिन इन रेटिंगों का परिणाम लगभग 5 के आसपास समान होता है। जिसका अर्थ है कि एक विशिष्ट फिल्म के लिए रेटिंग (1 से 10) का वितरण मूल रूप से वही है। यह "यथार्थवादी" नहीं है क्योंकि इस तरह की रेटिंग वाली रेटिंग वाली सभी फिल्में समान औसत होंगी, इस प्रकार अलग-अलग उपयोगकर्ताओं और विभिन्न उपयोगकर्ताओं की समान रेटिंग, वास्तव में कोई फर्क नहीं पड़ता।

मैं चाहता था कि मूवी ए की औसत 7 हो, फिल्म बी औसत 5, मूवी सी औसत 8, आदि ... लेकिन मैं सिर्फ यह नहीं चाहता कि औसत प्रत्येक फिल्म के लिए अलग हो। मेरा मतलब है, यह (उपयोगकर्ताओं की एक विशिष्ट संख्या के लिए) इस तरह के मूल्यांकन के उत्पादन के लिए अच्छा होगा: http://www.imdb.com/title/tt1046173/ratings या इस http://www.imdb.com/title/tt0486640/ratings

तुम्हें पता है, कुछ यादृच्छिक कि उपरोक्त उन जैसे दो अलग अलग रूपों का उत्पादन कर सकता है। मैंने रीफ्रेश मारा और मुझे पहला ग्राफ मिलता है, मैंने रीफ्रेश मारा और दूसरा प्राप्त किया, फिर से मारा और कुछ अलग या समान, कुछ "यादृच्छिक" और "यथार्थवादी" प्राप्त किया।

मैं अपने ऐप पर इस तरह के ग्राफ प्रदर्शित करने जा रहा हूं ताकि अलग-अलग वितरण हो। लेकिन मुझे नहीं पता कि मैं इसे सब कुछ उत्पन्न करने के लिए एक साधारण स्क्रिप्ट के साथ यादृच्छिक रूप से कैसे पूरा कर सकता हूं।

मैं इसे कैसे हल कर सकता हूं? शायद यह बहुत अधिक काम नहीं लायक है?

शायद कुछ आसान, जैसे बिंदु (1 और 10 के बीच) का चयन करें और फिर रेटिंग का सामान्य वितरण बनाएं जहां चयनित बिंदु सबसे ज्यादा है, जो मेरे लिए काम करेगा।

+0

आपके प्रश्न को समझ में नहीं आता है ... क्या आप यादृच्छिक रूप से मौजूदा फिल्म सूची से रेटिंग चार्ट का चयन करना चाहते हैं? – ajreal

+0

नहीं, मैं रेटिंग को यादृच्छिक बनाना चाहता हूं जो उपरोक्त चार्टों के समान दिखते हैं, इसलिए मैं उन्हें डेटाबेस में डाल सकता हूं और उनके साथ काम करने के लिए कुछ डेटा रख सकता हूं। –

+1

गूंज '9'; // आप इसे यादृच्छिक नहीं कर सकते –

उत्तर

4

आप माध्य, और शायद भिन्नता को ठीक करना चाहते हैं, और उन लोगों के आसपास यादृच्छिक संख्याएं उत्पन्न करना चाहते हैं।

यह मदद करनी चाहिए आप आरंभ: Generating random numbers with known mean and variance

संपादित करें: वास्तव में, यदि आप इसके बारे में सोचते यह आसानी से हल किया जा सकता: कारण अपने नंबर 5 की ओर प्रवृत्त कर रहे हैं, क्योंकि आपके पैमाने 1 और के बीच है 10 (तो मतलब 5 है)।

बस अपनी यादृच्छिक संख्याएं लें, उन सभी को 8 जोड़ें, और 10 से 10 से अधिक संख्या के किसी भी संख्या के चारों ओर गोल करें, और आपको 8-आश (लेकिन उपरोक्त skewed) के आसपास केंद्रित कुछ मिल जाएगा। शायद आपके उद्देश्यों के लिए पर्याप्त अच्छा है?

+0

मुझे नहीं लगता कि यह है। संख्याएं 5 कारणों की ओर बढ़ रही हैं यादृच्छिक जनरेटेड संख्याएं समान हैं, एक संख्या उत्पन्न करने की संभावना हर दूसरे नंबर के लिए बिल्कुल समान है।उनमें से सभी को 8 जोड़ना और 10 से 10 तक बड़ा गोल करने से मुझे कुछ अलग मिल जाएगा लेकिन प्रत्येक रेटिंग में समान वोट होंगे। –

0

मेरा उद्देश्य आपको रैंडन नंबर पीढ़ी में समय शामिल है, यादृच्छिक पीढ़ी को बेहतर बनाने के लिए mt_rand जैसे कार्यों का भी उपयोग करें। कुछ जटिल फ्लोट सेशन और int को कास्टिंग करने का प्रयास करें और आखिरकार% max_value लागू करें ताकि परिणाम आपकी सीमा के अनुरूप हो।

उदाहरण:

function x() 
{ 
return (time() * 7.3333333333 * mt_rand(0.1 , 10.1)); 
} 

$rank = (x() + 3.99999) % 10); 

मैं यह नहीं कह रहा हूँ यह काम करता है लेकिन विचार ilustrates। आशा करता हूँ की ये काम करेगा!

3

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

एक यादृच्छिक संख्या चुनें जो फिल्म के औसत स्कोर के रूप में कार्य करेगी। फिर, उस औसत की ऊपरी सीमा में यादृच्छिक संख्याओं का एक सेट उत्पन्न करें। उदाहरण के लिए, यदि आप यादृच्छिक रूप से 7 उत्पन्न करते हैं, तो 5 और 9 के बीच यादृच्छिक संख्याएं उत्पन्न करें। फिर आउटलेटर्स की उपस्थिति देने के लिए 1 से 6 और 8 से 10 के कुछ मानों को फेंक दें।

संपादित करें:

यह answer आप जो खोज रहे हैं, जावा में कोड के साथ पूरा हो सकता है।

सम वितरण उदाहरण:

आपका कोड की संभावना के समान है निम्नलिखित:

public class EvenDistribution 
{ 
    private static Random random = new Random(); 

    public static void main(String[] args) 
    { 
     int maxValue = 20; 

     int[] distribution = new int[maxValue]; 

     int iterations = 1000; 

     for (int i = 0; i < iterations; i++) 
     { 
      int rand = random.nextInt(maxValue); 
      distribution[rand]++; 
     } 

     for (int i = 0; i < distribution.length; i++) 
     { 
      System.out.println(i+1+": "+distribution[i]); 
     } 
    } 
} 

इस वर्ग निम्नलिखित आउटपुट था:

1: 47
2: 45
3 : 59
4: 5: 54
6: 52
7: 49
8: 49
9: 49
10: 48
11: 12: 43
13: 42
14: 15: 43
16: 55
17: 18: 55
19 : 64
20:

वितरण बहुत भी है। 1 9 थोड़ा असामान्य दिखता है, लेकिन कुल मिलाकर हम कह सकते हैं कि आरएनजी की यह विधि अनुमानित परिणाम उत्पन्न करती है।

ऊपर उल्लिखित गणित असामान्य पुस्तकालय का उपयोग करके, मैंने GaussianGenerator का उपयोग करके समान कोड का उपयोग किया।

: 1: 19
2: 27
3: 41
4: 68
5: 110
6: 111
7: 125

public class RandomDistribution { 
    private static MersenneTwisterRNG random = new MersenneTwisterRNG(); 
    private static GaussianGenerator gen = new GaussianGenerator(7, 3, random); 

    public static void main(String[] args) 
    { 
     int maxValue = 20; 

     int[] distribution = new int[maxValue]; 

     int iterations = 1000; 

     for (int i = 0; i < iterations; i++) 
     { 
      int rand = Math.abs(gen.nextValue().intValue()); 
      distribution[rand]++; 
     } 

     for (int i = 0; i < distribution.length; i++) 
     { 
      System.out.println(i+1+": "+distribution[i]); 
     } 
    } 
} 

यह निम्न उत्पादन का उत्पादन
8: 138
9: 125
10: 85
11: 64
12: 32
13: 32
14: 14
15: 5
16: 2
17: 1
18: 0
19: 1
20: 0

ऐसा लगता है कि इस पुस्तकालय की तरह आप जो कुछ करने की कोशिश कर रहे हैं उसके लिए बहुत अच्छा होगा।

+0

तो मुझे बस ऐसा कुछ चाहिए लेकिन PHP के लिए। गॉसियन जेनरेटर शायद मैं जो खोज रहा हूं। –

+0

@Nazgulled: मठ असामान्य ओपन सोर्स सॉफ्टवेयर है, इसलिए आप GausianGenerator के लिए PHP में उपयोग किए जाने वाले कोड को अनुकूलित कर सकते हैं। –

1

अच्छी गुणवत्ता वाले यादृच्छिक संख्याओं के लिए मेर्सन ट्विस्टर एल्गोरिदम का प्रयास करें।

http://en.wikipedia.org/wiki/Mersenne_twister

मुझे लगता है कि इन बुरा आदमी से कुछ php कार्यान्वयन देखते हैं:

http://www.phpdig.net/ref/rn35re672.html

अच्छा php कार्यान्वयन: डी

+0

अकेले मेर्सन ट्वीस्टर पर्याप्त नहीं है। उन्हें पीढ़ी के लिए कुछ कृत्रिम वितरण जोड़ने की जरूरत है। –

0

केनी से गर्भित रूप में, आप एक को देखने के लिए चाहते हैं सामान्य वितरण। यदि आप आईएमडीबी पर रेटिंग देखते हैं, तो आप करेंगे कि ज्यादातर फिल्में सामान्य वितरण का पालन करती हैं। अपवाद बहुत ऊपर और नीचे रैंकिंग हैं। बहुत से लोग कहेंगे कि वे किसी फिल्म से नफरत करते हैं या प्यार करते हैं - वे अपनी सच्ची भावनाओं को अतिरंजित करते हैं, इसलिए ये स्पाइक्स। तो डेटा के एक सटीक सेट के लिए, आपको इन्हें जोड़ने की आवश्यकता होगी। शायद सबसे कम रैंकिंग = (अगले दो सबसे कम योग) * स्थिर रहें?

+0

मुझे वास्तव में सटीक डेटा की आवश्यकता नहीं है, मैं नहीं चाहता कि सभी फिल्में एक समान वितरण (केवल परीक्षण उद्देश्यों के लिए) हों, उसी अर्थ में केंद्रित हों। मैं फिर PHP के साथ सामान्य वितरण में देखता हूँ। –

0

मैं भी केनी की सलाह का समर्थन करता हूं लेकिन कार्यान्वयन पर एक नोट जोड़ना चाहता हूं। यद्यपि यह सबसे अच्छा तरीका नहीं है, मैंने देखा है कि यह आसानी से कुछ बार लागू हुआ है।

एक तत्व के दस तत्वों की कल्पना करें जिसमें प्रत्येक तत्व 10 के मान वाले होते हैं। यदि आप 1 से 100 के बीच यादृच्छिक संख्या उत्पन्न करना चाहते हैं तो आप सरणी में अगली अनुक्रमणिका में आगे बढ़ने वाले प्रत्येक तत्व को जोड़कर सरणी में भरोसा कर सकते हैं इस बिंदु तक सरणी के मानों के योग से अधिक है। इस तरह आप 1-100 से 1-10 तक मैप करने में सक्षम हैं।

हालांकि उपर्युक्त इस तकनीक का एक भयानक उपयोग होगा, लेकिन आप आसानी से देख सकते हैं कि आप अपनी रचनात्मकता के साथ कैसे बना सकते हैं अपने स्वयं के समान वर्दी वितरण बना सकते हैं। मिसाल के तौर पर विचार करें:

1,2,4,8,16,16,8,4,2,1

ऊपर 10 तत्वों 64 का योग और इतनी अच्छी तरह से 10 से मानचित्रण 64 के लिए अनुकूल होगा (यह सिर्फ एक उदाहरण है)। मैंने जो कार्यान्वयन देखा है, वह वितरण हमेशा एक विशेष संख्या के बराबर होता है, लेकिन यदि आप 1-10 से यादृच्छिक संख्या प्राप्त करते हैं तो आपके पास अलग-अलग वितरण हो सकते हैं।

केवल कुछ ऐसे वितरणों को बनाकर आप संभावना वैक्टरों को जोड़कर संभावित रूप से कई समझदार वितरण बना सकते हैं (लगभग 3 के आसपास स्थानीयकृत वितरण और 8 के आसपास अत्यधिक वितरण वाले वितरण पर विचार करें, शायद यह नवीनतम ज़ोंबी स्लेशर और ज़ोंबी प्रेमी है 8 वोट दिया क्योंकि ज़ोंबी फिल्मों के रूप में यह बहुत अच्छा था और बाकी की फिल्म जाने वाले मूवी ने 3 वोट दिया क्योंकि ... सामान्य रूप से यह अधिक कम चूसा जाता था)।

संबंधित मुद्दे