Wpis z mikrobloga

Zna ktoś jakiś fajny algorytm do generacji liczb losowych/pseudolosowych z ustawieniem szans wylosowania? Np losuję 0 - 9 i dla zera, jedynki jest prawdopodobieństwo po 2%, dla 2,3 po 10%, dla 4,5 po 6% itd. Krzywą gaussa to prosto zrobić losując kilka liczb i potem dodając to i dzieląc. Czy trzeba samemu rzeźbić? Najbardziej toporna metoda to zbudowanie tablicy z taką częstotliwością jaką się chce i losowanie indeksu, ale może jest coś zgrabniejszego?

#programowanie #algorytmy
  • 7
via Wykop Mobilny (Android)
  • 0
@Rasteris: no to python ( z resztą w tym przypadku składnia niemal identyczna) i pierwszy wynik z google

public class Random { public static void main(String [] args) { double d = Math.random(); if (d < 0.53) { //53% szansy } else if (d < 0.85) { //32% szansy } else if (d < 0.95) { //10% szansy } else { //5% szansy } }
@ECMAlover: fajne jak masz 10 wartości możliwych, przy 50 czy 100 już mniej, a budowanie if else na dwie strony... Doszedłem do wniosku, że do moich potrzeb wystarczy jak będę generował wg przesuniętej i przyciętej krzywej gaussa i może jeszcze skompresuję część.
A przyszedł mi do głowy inny algorytm, ale dość zachłanny. Generuję jakąś funkcję i pożądanym przebiegu. A potem generuję parę liczb x,y. y jest ograniczone maksymalną wartością funkcji. I
via Wykop Mobilny (Android)
  • 0
@Rasteris: no możesz zawsze wrzucać kilka tych samych liczb do listy. Chcesz mieć dokładność do pierwszego miejsca po przecinku to robisz tablice 1000 elementów i jak chcesz żeby 4 miało 10% szansy to dodajesz 100 czwórek do listy
@Infamiee: poszedłem inną drogą. Generuję pięc licz losowych. Z różnych zakresów trochę. Np

r1 = rnd(5,10) r2 = rnd(1,70), r3 = rnd(5,15)....

Potem dodaję do siebie wygenerowane liczby i dzielę przez 5. Ważne, żeby suma górnych zakresów wynosiła 5 * wymagany zakres. Każde losowanie ma wagę 20%. Liczbą zakresów i liczbą losowqń mozna manipulować tak, żeby uzyskać pożądany zakres. Nawet 10 losowqń zajmie mniej czasu niż budowa wielkiej tablicy. Tablicę to