SORU
19 Kasım 2009, PERŞEMBE


Ağırlıklı rasgele sayılar

Ağırlıklı rastgele bir sayı uygulamaya çalışıyorum. Şu anda sadece kafamı duvarlara vurmaya gidiyorum ve bu rakam.

Projemde onları el aralıkları, öznel hepsi Tut hisse analizi (), Boost rasgele fonksiyonları kullanıyorum. Hadi 1 ve 3 arasında rastgele bir sayı (1, 2 veya 3) seçin. Boost mersenne twister jeneratör bu bir cazibe gibi çalışır. Ancak, seçim bu gibi örneğin ağırlıklı olmak istiyorum

1 (90% chance to be picked up)
2 (56% chance to be picked up)
3 ( 4% chance to be picked up)

Artırmak için bu işlevi var mı?

CEVAP
19 Kasım 2009, PERŞEMBE


Öğeleri tek tek ağırlıkları var burada rastgele: bir öğe seçmek için basit bir algoritma var

1) Tüm ağırlıklar toplamını hesaplar

2) 0 veya daha fazla rastgele bir sayı tut ve ağırlıkları toplamından daha azdır

3) öğeleri rasgele sayı o maddenin ağırlığı daha az olduğu madde elde edene kadar bir defada bir, rasgele sayı ağırlıkları çıkararak

Pseudo-code bu gösteren:

int sum_of_weight = 0;
for(int i=0; i<num_choices; i  ) {
   sum_of_weight  = choice_weight[i];
}
int rnd = random(sum_of_weight);
for(int i=0; i<num_choices; i  ) {
  if(rnd < choice_weight[i])
    return i;
  rnd -= choice_weight[i];
}
assert(!"should never get here");

Bu ve bu tür destek konteynerleri, uyum sağlamak kolay olur.


Eğer ağırlıkları nadiren değişti ama genellikle birini seç rastgele ve sürece konteyner depolama işaretçiler, nesneleri ya da daha fazla birkaç düzine öğeleri uzun (temel olarak, profil için biliyorum eğer bu yardımcı ya da engel), sonra bir optimizasyon:

Her maddenin toplam ağırlığı toplam depolayarak öğeyi pick karşılık almak için binary search bir ağırlık kullanabilirsiniz.


Eğer listedeki öğelerin sayısını biliyorsun eğer değilse, o zaman ağırlıklı adapte edilebilir, çok temiz bir algoritma reservoir sampling adında bir kız vardı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AyfionGaming

    AyfionGaming

    20 ŞUBAT 2013
  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005
  • LimeFire

    LimeFire

    2 ŞUBAT 2012