Powiel możliwe:
how to get uniformed random between a, b by a known uniformed random function RANDOM(0,1)Jak wdrożyć losowe (a, b) tylko losowe (0,1)?
W Księdze Wprowadzenie do algorytmów istnieje akcyzowy:
Opisać procedury random (a, b) która wykonuje tylko połączenia losowe (0,1). Jaki jest przewidywany czas trwania procedury, w zależności od a i b? Prawdopodobieństwo wyniku losowego (a, b) powinno być czysto równomiernie rozłożone, ponieważ losowe (0,1)
Dla funkcji losowej wyniki są liczbami całkowitymi z przedziału od a do b włącznie. Na przykład Random (0,1) generuje 0 lub 1; Losowy (a, b) generuje a + 1 a + 2, ..., b
Proponowane rozwiązanie jest tak:
for i = 1 to b-a
r = a + Random(0,1)
return r
czas odtwarzania jest T = BA
Czy to prawda? Czy wyniki moich rozwiązań są równomiernie dystrybuowane?
Dzięki
Co jeśli moje nowe rozwiązanie jest tak:
r = a
for i = 1 to b - a //including b-a
r += Random(0,1)
return r
Jeśli nie jest poprawna, dlaczego R + = Losowy (0,1) sprawia, że R nie równomiernie rozmieszczone?
Twoje rozwiązanie nie jest równomiernie rozmieszczone. Jako przykład, najniższa wartość "a" może być "wyliczona" tylko przez sumę losową (0) + losową (0) + losową (0) + .... jednak prawdopodobieństwo wartości w "środku" jest wyższa, ponieważ można ją obliczyć jako 0 + 0 + 0 + 1 + 1 i 0 + 0 + 1 + 0 + 1 i 1 + 1 + 0 + 0 + 0 i tak dalej. Pomyśl o tym jak rzucanie 2 kostkami. Prawdopodobieństwo uzyskania 2 (1 + 1) lub 12 (6 + 6) jest niższe niż prawdopodobieństwo uzyskania 7 (1 + 6,2 + 5,3 + 4,4 + 3,5 + 2,6 + 1) (osadnicy z catan ftw.;)). – Progman
Twoja druga linia resetuje 'r' za każdym razem. Powinieneś zainicjalizować ją na 'a', a następnie zaktualizować ją w kategoriach samej w pętli. –