Wpis z mikrobloga

Jak odpowiednio zaimplementować w JS losowanie z listy ale różnicując prawdopodobieńśtwo?
Załóżmy, że mam listę:
var colors = Array("Green", "Orange", "Bordo")
I teraz chciałbym wylosować wartość, ale zgodnie z prawdopodobieństwem, powiedzmy:
Green: 10%
Orange: 70&
Bordo: 20%
Jak to odpowiednio zaimplementować w JS?
Wiem jak to odpowiednio zrobić w Pythonie, ale implementacja rozwiązania w JS wychodzi mi dość pokracznie. Niestety średnio znam ten język, a chciałbym coś skończyć dziś i żeby nie wyglądało to w stylu "O matko boska, kto to napisał?!".

#javascript
  • 10
@venomik: wylosuj liczbę z przedziału od 1 do 100 i iteruj po tablicy. Odejmujesz od wylosowanej liczby liczbę z tablicy i jeżeli wynik jest mniejszy lub równy zero to znaczy, że wylosowales tą pozycję z liczby. Jeżeli nie to iterujesz dalej. W końcu zejdziesz poniżej 0.
@frogi16: A to jest faktycznie najlepszy sposób?
Nie lepiej utworzyć słownik odpowiadający:
Green: 10
Orange: 80
I losować liczbę z zakresu 1-100 i zrobić if (n<11) to green, else (n<81) to orange, a jeśli nie to Bordo? Powinno być ładniejsze, ale nie wiem czy odpowiednie w JS.
@venomik: chcesz mieć rozwiązanie hard code'owane? A jak będziesz chciał cokolwiek zmienić to będziesz wszystko w kodzie szukał i podmieniał ręcznie? Mój sposób jest efektywny, elegancki i automatycznie się dostosowuje do danych wejściowych (równie dobrze możesz zapodać 8 różnych kolorów i dalej zadziała dobrze). Twoim problemem nie jest JS tylko brak myślenia algorytmicznego. Nawet w tym, dość trywialnym problemie.
@frogi16: Chcę mieć sposób który nie skończy się:
"Programuję w JS 10 lat, ten kod działa, ale to totalny śmietnik, przepisz to na coś lepszego", a zamiast tego będzie przynajmniej:
"Ok, nie jest to rozwiazanie ani najładniejsze, ani najbardziej zgodne z podejściem w JS czy najwydaniejsze, ale może w sumie być"

W Pythonie wiele rzeczy kończy się: "To działa, jest spoko, ale jest oczywiste rozwiązanie bardziej w duchu Pythona, więc zmień
@venomik: rób co chcesz, ale pisanie else chainów jest równie #!$%@? w każdym języku. Zadaj sobie proste pytanie: jak będziesz chciał coś zmodyfikować to ile poprawek będzie wymagał twój kod, a ile mój.
Dodasz parę komentarzy i nawet Hindus zrozumie o co chodzi, to nie jest skomplikowane.
@venomik: #!$%@?.

Twój sposob:
Losujesz liczbę i dla każdej pozycji w tabeli musisz mieć ifa lub elsa. Do tego wg twojej propozycji porownujesz zmienną z wartościami wpisanym w kod (80 itp.) W razie konieczności zmiany czegokolwiek musisz zmodyfikować tablicę i każde miejsce w kodzie, gdzie użyłeś tego kawałka kodu. Musisz zmodyfikować ify, albo je dodać.

Mój sposób:
Losujesz liczbę i algorytm sam iteruje po wszystkich możliwościach i na output dostajesz to,
@dannycarter: ogólnie tak, ale lepiej użyć zwykłego fora i robić break jak się znajdzie odpowiedni przedział, bo obecnie robisz n iteracji zawsze (n to ilość możliwych do wylosowania rzeczy, obecnie 3), podczas gdy z breakiem możesz osiągnąć n jako pesymistyczny przypadek.