3 Eylül 2018 Pazartesi

discrete_disctribution Sınıfı

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