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
Öğ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ı.
Yineleme yok ile oluşturmak rasgele sa...
Tam sayılar rasgele liste oluşturmak P...
Rasgele sayılar don't çok rastgel...
O (non-yinelenen) benzersiz rasgele sa...
Rastgele ağırlıklı bir sürüm.seçim...