Ok, aquí está mi opinión sobre esto.
¿Puedo reducir este problema a algo que ya sé? Creo que sí, supongamos que tenemos solo 2 números y una moneda y le pedimos que devuelva un número aleatorio entre los dos números.
¿Como lo haras? No lea más a menos que tenga una respuesta a esto o al menos haya ejercitado su cerebro.
.
- ¿Cómo [math] {} ^ {n-1} C_ {r-1} + {} ^ {n-1} C_r = {} ^ nC_r [/ math] deriva de [math] {} ^ nC_r = \ frac {n!} {r! (nr)!}? [/ math]
- Cómo resolver esta pregunta de Coupondunia que está alojada por HackerEarth
- Cómo resolver este problema
- Cómo calcular mentalmente productos rápidamente
- ¿Cuáles son los algoritmos de mínimos cuadrados cuadrados (LMS)?
.
Solo arroje la moneda y, según la cabeza o la cola, puede decidir el número que desea devolver. Entonces, ¿cómo resuelve esta solución el problema actual al que nos enfrentamos, es decir, lanzar un dado y luego devolver un número entre 1 y 7.
¿Podemos hacer que el resultado de lanzar un dado sea igual que lanzar una moneda? Si no lo es. ¿Cómo? El resultado de lanzar un dado puede dividirse en dos grupos, es decir, devolver la cabeza cuando el número está entre 1 y 3 y devolver la cola cuando el número está entre 4 y 6.
Ahora la pregunta se traduce a ¿podemos lanzar una moneda y devolver un número aleatorio entre 1 y 7? Sí, podemos verdad? Pensar.
.
.
Bueno, ¿qué pasa si podemos torcer un poco la pregunta y decir: devolver un número aleatorio entre 1 y 8 usando una moneda justa? Solo tenemos que dividir los números del 1 al 8 en 2 medias, tiene la misma probabilidad de elegir cualquiera de las dos (porque lanzar una moneda genera 0 o 1 con la misma probabilidad ). Esto significa claramente que no habrá ningún caso en el que elegiremos solo 1 mitad de 2, por lo tanto , siempre podemos lograr todos los números .
Código a continuación:
importar al azar
def random_1_8 (inicio, fin):
mientras que (1):
resultado = random.randint (0, 1) # lanzamiento de monedas simulando
si end-start + 1 == 2:
retorno final si el resultado más comienza
mid = (inicio + fin) / 2
if (fin-inicio + 1) == 2:
rotura;
si resultado == 1:
final = medio
más:
inicio = medio + 1
para i en rango (0, 40):
print (random_1_8 (1, 8))
Ahora, ¿qué debemos hacer en caso de que necesitemos devolver un resultado cuando los números son del 1 al 7? En ese caso, todo lo que tenemos que hacer es reiniciar el proceso cuando obtenga 8 según el concepto de muestreo de rechazo.
Código a continuación:
importar al azar
def random_1_7 (inicio, fin):
mientras que (1):
resultado = random.randint (0, 1) # lanzamiento de monedas simulando
si end-start + 1 == 2:
si resultado:
devuelve random_1_7 (1, 8) si end == 8 más end
más:
devuelve random_1_7 (1, 8) si start == 8 else start
mid = (inicio + fin) / 2
if (fin-inicio + 1) == 2:
rotura;
si resultado == 1:
final = medio
más:
inicio = medio + 1
para i en rango (0, 40):
print (random_1_7 (1, 8))