Giriş
boost kütüphanesindeki karşılığı discrete_distribution Sınıfı.
Bu sınıf tanım olarak [0,n) aralığında verilen ağırlığa göre dağılım yapar. n sayısı verilen ağırlık sayısından çıkarılır.
Constructor
İmzası şöyle
discrete_distribution();
explicit discrete_distribution(
const param_type& par0
);
discrete_distribution(
initializer_list<double> IList
);
template<class Fn>
discrete_distribution(
size_t count,
double low,
double high,
Fn func
);
Örnekİçine ağırlıkları alan constructor şöyle kullanılır.
discrete_distribution d({1,2,3});
Örnek
İçine iterator alan constructor şöyle kullanılır.
const vector<float> v = ...;
discrete_distribution d (v.begin(),v.end());
Distribution sınıfı kurulduktan sonra bir generator ile sayı dağılımı yapılır.random_device r;
mt19937 m(r());
d (m);
DiğerŞöyle yaparız.
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class WeightedRandomBag<T extends Object> {
private class Entry {
double accumulatedWeight;
T object;
}
private List<Entry> entries = new ArrayList<>();
private double accumulatedWeight;
private Random rand = new Random();
public void addEntry(T object, double weight) {
accumulatedWeight += weight;
Entry e = new Entry();
e.object = object;
e.accumulatedWeight = accumulatedWeight;
entries.add(e);
}
public T getRandom() {
double r = rand.nextDouble() * accumulatedWeight;
for (Entry entry: entries) {
if (entry.accumulatedWeight >= r) {
return entry.object;
}
}
return null; //should only happen when there are no entries
}
}
Çağırmak için şöyle yaparız.WeightedRandomBag<String> itemDrops = new WeightedRandomBag<>();
// Setup - a real game would read this information from a configuration file or database
itemDrops.addEntry("10 Gold", 5.0);
itemDrops.addEntry("Sword", 20.0);
itemDrops.addEntry("Shield", 45.0);
itemDrops.addEntry("Armor", 20.0);
itemDrops.addEntry("Potion", 10.0);
// drawing random entries from it
for (int i = 0; i < 20; i++) {
System.out.println(itemDrops.getRandom());
}
Hiç yorum yok:
Yorum Gönder