Duplicar posible:
how to get uniformed random between a, b by a known uniformed random function RANDOM(0,1)¿Cómo implementar Random (a, b) con solo Random (0,1)?
En el libro de Introducción a los algoritmos, hay un especial:
describir una aplicación del procedimiento aleatorio (a, b) que solo hace llamadas a Aleatorio (0,1). ¿Cuál es el tiempo de ejecución esperado de su procedimiento, como una función de a y b? La probabilidad del resultado de Random (a, b) debe ser puramente distribuida uniformemente, como Random (0,1)
Para la función Random, los resultados son enteros entre ayb, inclusive. Por ejemplo, Random (0,1) genera 0 o 1; Aleatorio (a, b) genera a, a + 1, a + 2, ..., b
Mi solución es la siguiente:
for i = 1 to b-a
r = a + Random(0,1)
return r
el tiempo de ejecución es T = ba
¿Es esto correcto? ¿Los resultados de mis soluciones están distribuidos uniformemente?
Gracias
¿Qué pasa si mi nueva solución es la siguiente:
r = a
for i = 1 to b - a //including b-a
r += Random(0,1)
return r
Si no es correcto, ¿por qué r + = aleatorio (0,1) hace r no se distribuye de manera uniforme?
Su solución no se distribuye uniformemente. Como ejemplo, el valor más bajo 'a' solo puede ser" calculado "por la suma de random (0) + random (0) + random (0) + .... pero la probabilidad de un valor en" the middle "es más alto porque se puede calcular como 0 + 0 + 0 + 1 + 1, y 0 + 0 + 1 + 0 + 1, y 1 + 1 + 0 + 0 + 0, y así sucesivamente. Piensa que es como tirar 2 dados. La probabilidad de obtener 2 (1 + 1) o 12 (6 + 6) es menor que la probabilidad de obtener 7 (1 + 6,2 + 5,3 + 4,4 + 3,5 + 2,6 + 1) (colonos de catan ftw.;)). – Progman
Su segunda línea restablece 'r' cada vez. Debería inicializarlo en 'a' y luego actualizarlo en términos de sí mismo en el ciclo. –