czwartek, 22 listopada 2012

Generator liczb losowych: losowanie sukcesu z zadanym prawdopodobieństwem

Czasem w programie czy grze musimy wybrać jakąś akcję z pewnym prawdopodobieństwem. W grach planszowych (lub innych nie-komputerowych) stosuje się często tzw. kostki procentowe(*). Ogólnie takie losowanie można przyrównać do rzutu oszukaną monetą - gdzie prawdopodobieństwo sukcesu jest różne od 50%.

(*) - Najczęściej stosuje się kombinację dwóch kostek 10-ściennych. Prawdziwe kostki 100-ścienne są nieporęczne.

W programie jednak prawdopodobieństwo nie musi być zadane procentami - może być to liczba rzeczywista z zakresu [0; 1], albo liczba całkowita określająca względną częstość (w przypadku procentów - prawdopodobieństwo w procentach względem 100%).

Napisanie odpowiedniego kodu nie powinno przedstawiać żadnych trudności przeciętnemu programiście. Trzeba tylko pamiętać o użyciu odpowiedniego operatora porównującego:

int max; //maksymalna częstość (100 dla procentów)
int p; //zadane prawdopodobieństwo (jako względna częstość)
if(random(max)<p) return 1;
else return 0;

lub, jeśli prawdopodobieństwa są liczbami rzeczywistymi z zakresu [0; 1]

float p; //zadane prawdopodobieństwo
if(random()<p) return 1; //random zwraca tu liczbę z zakresu [0; 1)
else return 0;

Jak widać, użyłem operatora '<'. To ważne - gdyby użyć operatora '<=' (lub skonstruować inny, równoważny temu kod), taka funkcja zwracałaby sukces z trochę większym niż zadane prawdopodobieństwem. Tego rodzaju błąd (pomyłka o 1) ma chyba nawet swoją nazwę - kiedyś widziałem, niestety nie pamiętam już teraz, jak coś takiego mogło się nazywać. Jeśli ktoś ma kłopoty, jakiego porównania użyć, to mogę doradzić, aby poeksperymentował z małymi liczbami - ja tak zawsze robię, jeśli mam jakieś wątpliwości.

Brak komentarzy:

Prześlij komentarz