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