बेतरतीब ढंग से इस्तेमाल की उनकी आवृत्ति के अनुसार पत्र उत्पन्न?

वोट
10

मैं कैसे बेतरतीब ढंग से आम भाषण में उपयोग की उनकी आवृत्ति के अनुसार पत्र उत्पन्न कर सकते हैं?

किसी भी छद्म कोड की सराहना की है, लेकिन जावा में एक कार्यान्वयन शानदार होगा। अन्यथा सिर्फ सही दिशा में एक प्रहार उपयोगी होगा।

नोट: मैं उपयोग के आवृत्तियों उत्पन्न करने के लिए की जरूरत नहीं है - मुझे यकीन है कि मुझे लगता है कि आसानी से पर्याप्त देख सकते हैं हूँ।

27/01/2010 को 21:11
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
11

एक त्वरित तरीका है यह करने के लिए पत्र है, जहां प्रत्येक पत्र इसकी आवृत्ति के अनुसार सूची में दिखाई दिया की एक सूची उत्पन्न करने के लिए किया जाएगा। , कहो, तो "ई" समय की 25.6% इस्तेमाल किया गया था, और अपनी सूची सीमा 1000 था, यह 256 "ई" रों होगा।

तो फिर तुम सिर्फ बेतरतीब ढंग से उपयोग करके सूची से स्पॉट ले सकता है (int) (Math.random() * 1000)0 और 999 के बीच यादृच्छिक संख्या उत्पन्न करने के लिए।

27/01/2010 को 21:14
का स्रोत उपयोगकर्ता

वोट
18

मुझे लगता है कि आप 0 और 1 1 बनाने के लिए कुल कि के बीच चल बिन्दु संख्या के रूप में आवृत्तियों की दुकान संभालने कर रहा हूँ।

सबसे पहले आप संचयी आवृत्तियों की एक तालिका तैयार करना चाहिए, कि पत्र की आवृत्ति और यह पहले सभी पत्र की राशि अर्थात्।

आसान बनाने के लिए, अगर आप इस आवृत्ति वितरण के साथ शुरू:

A  0.1
B  0.3
C  0.4
D  0.2

आपका संचयी आवृत्ति तालिका होगा:

A  0.1
B  0.4 (= 0.1 + 0.3)
C  0.8 (= 0.1 + 0.3 + 0.4)
D  1.0 (= 0.1 + 0.3 + 0.4 + 0.2)

अब 0 और 1 के बीच एक यादृच्छिक संख्या पैदा करते हैं और इस सूची में है कि संख्या में निहित है में जहां देखते हैं। पत्र छोटी से छोटी संचयी आवृति अपने यादृच्छिक संख्या की तुलना में बड़ा है का चयन करें। कुछ उदाहरण:

आप बेतरतीब ढंग से 0.612 लेने का कहना है। यह 0.4 और 0.8, बी और सी के बीच यानी के बीच स्थित है, तो आप सी निर्णय लेना होगा

यदि आपका यादृच्छिक संख्या 0.039 था, कि एक से पहले यानी 0.1 से पहले आता है, है, तो ए चुनें

मुझे आशा है कि समझ में आता है, नहीं तो स्पष्टीकरण के लिए पूछने के लिए स्वतंत्र महसूस हो रहा है!

27/01/2010 को 21:20
का स्रोत उपयोगकर्ता

वोट
4

भी नहीं एक छद्म कोड है, लेकिन एक संभव दृष्टिकोण इस प्रकार है:

P1, P2, ..., पी आवृत्तियों कि आप मिलान कराना चाहते हो।

  1. संचयी आवृत्तियों की गणना करें: p1, p1 + p2, p1 + p2 + p3, ..., 1
  2. एक यादृच्छिक वर्दी उत्पन्न (0,1) संख्या एक्स
  3. चेक जिनमें से संचयी आवृत्तियों एक्स अंतराल अंतर्गत आता है करने के लिए: अगर यह के बीच, कहते हैं, p1 + .. + अनुकरणीय और p1 + ... + अनुकरणीय + पी (i + 1), तो उत्पादन (i +1) सेंट पत्र है

कैसे आप अंतराल खोजने लागू के आधार पर, प्रक्रिया, अगर p1, p2, ... घटते क्रम में हल कर रहे हैं आमतौर पर अधिक कुशल है, क्योंकि आप आमतौर पर अंतराल युक्त एक्स जल्दी ही मिल जाएगा।

27/01/2010 को 21:20
का स्रोत उपयोगकर्ता

वोट
5

मैं क्या होगा चल बिन्दु संख्या ऐसी है कि उनकी राशि 1.0 है के रूप में रिश्तेदार आवृत्तियों पैमाने पर है। तब मैं की एक सरणी पैदा करेगा संचयी , पत्र के अनुसार योग संख्या है कि उस पत्र और उन सभी यह "नीचे" पाने के लिए सबसे ऊपर होना चाहिए अर्थात्। कहते हैं कि एक की आवृत्ति 10%, बी 2% है और z 1% है, तो अपनी मेज कुछ इस तरह दिखेगा:

0.000 A ; from 0% to 10% gets you an A
0.100 B ; above 10% is at least a B
0.120 C ; 12% for C...
...
0.990 Z ; if your number is >= 99% then you get a Z

तो फिर तुम अपने आप को 0.0 और 1.0 के बीच एक यादृच्छिक संख्या पैदा करते हैं और पहले नंबर अपने यादृच्छिक संख्या की तुलना में छोटे के लिए सरणी में एक द्विआधारी खोज करते हैं। तब उस स्थिति में पत्र लेने। किया हुआ।

27/01/2010 को 21:23
का स्रोत उपयोगकर्ता

वोट
2

एक द्विआधारी पेड़ का उपयोग करके आप सही प्रविष्टि को खोजने के लिए एक अच्छी, साफ रास्ता देती है। यहाँ, आप एक साथ शुरू frequencyनक्शा, जहां कुंजी प्रतीक (अंग्रेज़ी अक्षरों) कर रहे हैं, और मूल्यों उनकी घटना की आवृत्ति है। यह उलटा हो जाता है, और एक NavigableMapबनाई गई है जहां कुंजी संचयी संभावना हैं, और मूल्यों प्रतीक हैं। यही कारण है कि देखने के लिए आसान बनाता है।

  private final Random generator = new Random();

  private final NavigableMap<Float, Integer> table = 
    new TreeMap<Float, Integer>();

  private final float max;

  public Frequency(Map<Integer, Float> frequency)
  {
    float total = 0;
    for (Map.Entry<Integer, Float> e : frequency.entrySet()) {
      total += e.getValue();
      table.put(total, e.getKey());
    }
    max = total;
  }

  /** 
   * Choose a random symbol. The choices are weighted by frequency.
   */ 
  public int roll()
  {
    Float key = generator.nextFloat() * max;
    return table.higherEntry(key).getValue();
  }
27/01/2010 को 22:10
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more