Součet pravděpodobností je 1.
...
Budu generovat náhodná čísla r z intervalu <0;1*max(p)).
Když bych to měl ukázat na konkrétním příkladu:
A(0.1), B(0.2), C(0.7) r je z intervalu <0;0.7)
r= 0.47 => C
r= 0.1 => A
r= 0.15 => B
...a tak dál
No to si snad děláš legraci, ne?
Musíš generovat čísla z intervalu <0;1):
0----0.1----0.3----1
teprve teď velikosti intervalů jsou v poměru 1:2:7
Správné řešení je udělat to přes diskrétní rozložení pravděpodobnosti:
http://www.cplusplus.com/reference/random/discrete_distribution/
discrete_distribution je jenom obálka, která udělá to, co chtěla čajová houba udělat ručně v úvodním příspěvku.
"Správnost řešení" záleží na tom a pouze na tom, jestli použitý RNG (ať už se jedná o RNG použitý v discrete_distribution nebo o RNG použitý při "ručním" řešení) skutečně
generuje rovnoměrné rozdělení pravděpodobnosti.
O generátorech náhodných čísel nic nevím, ale selským rozumem předpokládám, že každý generátor, který rovnoměrné rozdělení negeneruje, je považován za vadný, a čekal bych že generátory zabudované v C++ vadné nebudou.
Pokud se toho ale bojíš, pak místo generátoru který generuje typ real, použij generátor typu integer (pro tvou vzorovou úlohu s pravděpodobnostmi 0.1, 0.2, 0.7 by generoval čísla 0 až 9). Ten by snad mouchy mít neměl