Náhodně generovat dopisy Podle jejich četnosti používání?

hlasů
10

Jak mohu náhodně generovat dopisy podle jejich četnosti použití v obyčejné řeči?

Jakékoli pseudo-code ocenil, ale implementace v Javě by bylo fantastické. V opačném případě stačí strčit správným směrem by byla užitečná.

Poznámka: Nepotřebuji generovat frekvence užívání - jsem si jistý, že může vypadat, že se poměrně snadno.

Položena 27/01/2010 v 21:11
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
11

Jeden rychlý způsob, jak to udělat, by bylo vytvoření seznamu písmen, kde se objevil každý dopis v seznamu v souladu s jeho frekvencí. Říkat, jestli „e“ bylo použito 25,6% času, a váš seznam měl délku 1000, mělo by to 256 „e“ ů.

Pak byste mohl jen náhodně vybrat místa ze seznamu pomocí (int) (Math.random() * 1000)ke generování náhodných čísel od 0 do 999.

Odpovězeno 27/01/2010 v 21:14
zdroj uživatelem

hlasů
18

Jsem za předpokladu, že budete ukládat kmitočty jako plovoucí desetinnou čárkou mezi 0 a 1, že celkové aby 1.

Nejprve byste měli připravit tabulku kumulativních frekvencí, tedy součet četnosti tohoto dopisu a všechna písmena před ním.

Pro zjednodušení, pokud začnete s tímto rozdělením frekvencí:

A  0.1
B  0.3
C  0.4
D  0.2

Váš kumulativní frekvenční tabulka bude vypadat následovně:

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)

Nyní generovat náhodné číslo mezi 0 a 1, a zjistit, kde v tomto seznamu toto číslo leží. Vyberte písmeno, které má nejmenší kumulativní frekvenci větší než vaše náhodného čísla. Nějaké příklady:

Řekněme, že jste náhodně vybere 0,612. To leží mezi 0,4 a 0,8, tedy mezi B a C, takže byste zvolit C.

Pokud váš náhodných čísel byl 0,039, které je před 0,1, tedy předtím, než A, takže vybrat A.

Doufám, že to dává smysl, jinak neváhejte požádat o vysvětlení!

Odpovězeno 27/01/2010 v 21:20
zdroj uživatelem

hlasů
4

Ani pseudo-kódu, ale možný postup je následující:

Nechť P1, P2, ..., pk být frekvence, které chcete, aby odpovídaly.

  1. Výpočet kumulované frekvence: p1, p1 + p2, p1 + p2 + p3, ..., 1
  2. Generování náhodných uniformu (0,1) číslo x
  3. Zkontrolujte, který interval z kumulativních frekvencí x patří: v případě, že je mezi, řekněme, P1 + .. + PI a P1 + ... + PI + p (i + 1), pak výstup (i + 1) st písmeno

V závislosti na tom, jak implementovat intervalu-nález, postup je obvykle účinnější, pokud P1, P2, ... jsou řazeny v sestupném pořadí, protože se obvykle najít interval obsahující x dříve.

Odpovězeno 27/01/2010 v 21:20
zdroj uživatelem

hlasů
5

Co budu dělat, je měřítko relativní frekvence jako desetinná čísla tak, aby jejich součet je 1,0. Pak bych vytvořit pole z kumulativních součtů na dopisu, tedy číslo, které musí být doplňovány, aby tento dopis a všem těm „dole“ to. Řekněme, že frekvence A, je 10%, b je 2% a z je 1%; pak váš stůl bude vypadat nějak takto:

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

Pak můžete vytvářet sami náhodné číslo mezi 0,0 a 1,0, a to hledání binární v poli pro první číslo menší, než je náhodné číslo. Pak vybrat ten dopis v této poloze. Hotovo.

Odpovězeno 27/01/2010 v 21:23
zdroj uživatelem

hlasů
2

Pomocí binárního stromu vám dává pěkný, čistý způsob, jak najít tu správnou položku. Zde můžete začít s frequencymapou, kde jsou klíče symboly (anglicky písmen) a hodnoty jsou četnost jejich výskytu. To dostane převrácený, a NavigableMapje vytvořen, kde jsou klíče kumulativní pravděpodobnost, a hodnoty jsou symboly. Že dělá vyhledávání snadné.

  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();
  }
Odpovězeno 27/01/2010 v 22:10
zdroj uživatelem

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