Rasgele Kullanım onların Frekansına Göre Mektuplar üret?

oy
10

Nasıl rastgele ortak konuşmada kullanım sıklıklarına göre mektuplar oluşturabilir?

Herhangi sözde kod takdir, ancak Java bir uygulama harika olurdu. Aksi takdirde sadece doğru yönde atılmış bir dürtme yararlı olacaktır.

Not: Ben kullanım frekansları üretmek gerekmez - Ben kolayca yeterince bu bakabilirsiniz eminim.

Oluştur 27/01/2010 saat 21:11
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
11

bunu yapmak için hızlı bir yolu, her harfin bir frekansta uygun listesinde göründüğü harfler, bir listesini oluşturmak olacaktır. "E" zamanın 25,6% kullanıldı ve listeniz uzunluğu 1000 olsaydı, Say, bu 256 "e" leri olurdu.

Sonra sadece rastgele kullanarak listeden noktalar almak olabilir (int) (Math.random() * 1000)0 ile 999 arasında rastgele sayı üretmek için.

Cevap 27/01/2010 saat 21:14
kaynak kullanıcı

oy
18

Sana 0 ve 1 olmak üzere toplam 1 arasında kayan nokta sayıları olarak frekansları saklamak olduğunu varsayıyorum.

Öncelikle, birikimli frekansların bir tablo hazırlamak o harfin sıklığı ve bundan önceki bütün harflerin toplamı yani olmalıdır.

Bu frekans dağılımı ile başlarsak, basitleştirmek için:

A  0.1
B  0.3
C  0.4
D  0.2

Sizin kümülatif frekans tablosu şöyle olacaktır:

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)

Şimdi, 0 ile 1 arasında rastgele bir sayı oluşturmak ve sayı yatıyor bu listede nerede olduğunu görmek. senin rastgele sayısından daha büyük en küçük kümülatif frekansı vardır harfi seçin. Bazı örnekler:

Eğer rastgele 0.612 almaya düşünelim. Bu B ve C arasındaki 0.4 ve 0.8, yani arasında uzanan, yani C seçerdim

senin rastgele sayı 0.039 idiyse, o A önce, yani 0.1 önce gelir, bu nedenle A. seçmek

Ben başka türlü açıklamalar için sormaya çekinmeyin, bu mantıklı umut!

Cevap 27/01/2010 saat 21:20
kaynak kullanıcı

oy
4

şöyle Bile bir sözde kod, ancak olası bir yaklaşımdır:

p1, p2, ..., pk eşleşmesini istediğiniz frekansları olsun.

  1. kümülatif frekansları hesaplayın: p1, p1 + p2, p1 + p2 + p3, ..., 1
  2. Rastgele üniform oluşturmak (0,1) sayısı x
  3. ait olduğu kümülatif frekanslar x aralığı kontrol etmek: Bu p1 + .. + pi ve p1 + ... + pi + p (i + 1), sonra çıkışı (i + 1) st mektup, diyelim ki, arasındaysa

p1, p2, ... azalan sırada sıralanır eğer genellikle aralık içeren x er bulacaksınız çünkü aralık-bulma uygulamak şekline bağlı olarak, prosedür, genellikle daha verimlidir.

Cevap 27/01/2010 saat 21:20
kaynak kullanıcı

oy
5

Ne yapacağını toplamları 1.0 olacak şekilde kayan nokta sayıları göreli frekansları ölçek olduğunu. Sonra bir dizi yaratacak birikimli , harf başına toplamları o mektubu ve tüm bu o "altında" olsun ilavesi yapılması gerektiği numarasını yani. A sıklığı,% 10, B% 2 ve z 1 ise% ki; sonra tablo şöyle görünecektir:

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

Öyleyse, kendine 0.0 ile 1.0 arasında rastgele bir sayı oluşturmak ve rasgele sayı daha küçük ilk sayısı için dizideki bir ikili arama yapmak. Sonra bu pozisyonda harfi seç. Bitti.

Cevap 27/01/2010 saat 21:23
kaynak kullanıcı

oy
2

Bir ikili ağaç kullanmak size doğru girdiyi bulmak için güzel, temiz bir yol sunar. Burada, bir ile başlar frequencytuşları semboller (İngilizce harfler) olan harita, ve değerleri oluşma sıklığı vardır. Bu ters alır ve NavigableMapanahtarlar kümülatif olasılık nerede oluşturulur ve değerler sembollerdir. Bu arama kolaylaştırır.

  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();
  }
Cevap 27/01/2010 saat 22:10
kaynak kullanıcı

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