Aquí es idiomaticish Ruby:
5.times do
puts (1..7).map { [0, 1].sample }.join
end
Vamos a descomprimirlo:
5.times do...end
es bastante auto-explicativo. Haga lo que esté entre do
y end
cinco veces.
(1..7)
genera una matriz con siete elementos. Realmente no nos importa lo que hay ahora. map
devuelve una nueva matriz donde cada elemento es el resultado de llamar a lo que hay entre llaves. Entonces siete veces llamaremos al [0, 1].sample
y exprimiremos los resultados en una matriz. El sample
sí mismo, por supuesto, escoge aleatoriamente 0
o 1
. Finalmente .join
convierte una matriz en una cadena. Si dijéramos .join('-')
, por ejemplo, pondría un guión entre cada elemento (1-0-0-1-1-1-0-1). Pero como no especificamos nada, no pone nada entre cada elemento (10011101).
Y ahí lo tienes.
Como han notado otros, para este problema en particular es posible hacer cosas más rápidas y más cortas usando binarios. Sin embargo, no creo que esta sea la manera Ruby. Con respecto a la velocidad, "la optimización prematura es la raíz de todo mal", y si tienes una aversión violenta al código lento, no deberías codificar Ruby de todos modos. Con respecto a la legibilidad, de esa manera puede ser más corto, pero el camino anterior es mucho más claro. "Oh, estamos haciendo algo cinco veces, y eso va a imprimir un largo de 7 elementos ... secuencia aleatoria de 0s y 1s ... como una cadena". Casi parece inglés (si conoce la palabra map (definición tres)).
Hacer una cadena vacía. Genere un número a la vez, como so rand (0-1), y añádalo a la cadena que estaba vacía al principio. Hazlo tantas veces como quieras dígitos. No puede tratar los números de decimales de esta manera sin contar el idioma de una manera u otra. Lo siento, no puedo hacer el código por ti. No tengo una implementación de ruby instalada ... –
¿Has buscado cómo funciona la función aleatoria? Y la resta? Y la terminación del bucle? –
Si puede imprimir archivos binarios fácilmente, puede generar números del 0-127 e imprimir la forma binaria de los mismos. – nhahtdh