C++ rasgele sayı üreteci almak için mücadele ediyorum.Binom rasgele sayı üretme
- jeneratör sadece
0
ven
arasındaki tamsayılar dönmelidir. - yüksek sayıda olasılığı daha yüksek olmalıdır düşük sayılar dönen olasılığı.
Örnek dağılımı:
1: ************************
2: ******************
3: **************
4: ************
5: ********
6: *****
7: ****
8: ***
9: **
10: *
dağıtım tipi benim durumumda önemli değil. Denediğim şey, [0..2*n]
değerleriyle binom dağılımı kullanmaktır. Daha sonra, zirveyi sıfırda tutmak için ortaya çıkan rastgele sayıları [0..n]
'a dönüştürüyorum.
size_t n = 20;
std::default_random_engine generator;
std::binomial_distribution<int> distribution(n*2, 0.5f);
int number = fabs(distribution(generator)-n);
Ortaya numaraları: Sorum
0: *************************
1: ***********************************************
2: *****************************************
3: ********************************
4: **********************
5: **************
6: ********
7: ****
8: **
9:
10-20: none. The numbers are very rare.
: Nasıl doğru böyle bir algoritma uygularım? Daha yüksek değerlerin olasılığını nasıl arttırabilirim, böylece dağıtım kullanılan n
'dan bağımsız olarak aynı kalır?
için, sonra üretim işlev çağrıları belirli bir sayısı için 0 ve n/2 arasında rasgele sayı üretmek 0 ila N üretilmesi için geçiş olabilir; Geri ve ileriye geçiş yapmak size daha yüksek değerler daha düşük değerler vermelidir. Bunu genelleştirebilirsiniz. – user2296177
@ user2296177 Bu ilginç bir fikir. Ancak rasgelelik kalitesi yeterince iyi olmazdı – maja
std :: geometric_distribution' denediniz mi? –