2012-06-20 19 views
5

Así que, básicamente, para la diversión que estaba tratando de generar una columna de números (7 dígitos solamente 0s y 1s) de mi código bastante corto:Como llegar al azar 0 y 1 los números

a = rand(0000000-1111111) 
b = 220 
a1 = rand(0000000-1111111) 
a2 = rand(0000000-1111111) 
a3 = rand(0000000-1111111) 
a4 = rand(0000000-1111111) 
a5 = rand(0000000-1111111) 

while b !=0 
    puts a 
    puts a2 
    puts a3 
    puts a4 
    puts a5 
end 

Mi problema es que en vez de generar una columna aleatoria de 0s y 1s todos se usan los números.

+0

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 ... –

+0

¿Has buscado cómo funciona la función aleatoria? Y la resta? Y la terminación del bucle? –

+2

Si puede imprimir archivos binarios fácilmente, puede generar números del 0-127 e imprimir la forma binaria de los mismos. – nhahtdh

Respuesta

12

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)).

+0

Supongo que depende del enunciado del problema y del _razón_ para que el programa exista. Cuando escucho que se generarán siete números '0' o' 1', solo puedo pensar en las representaciones de '0..127', por lo que se siente lo más natural para mí. Su inteligente '(1..7)' evita la horrible proliferación de variables que se usarían en el código ingenuo, y enseña la útil herramienta de crear una matriz anónima que se descarta rápidamente. – sarnold

+0

Tu versión sería mucho más fácil de'extender_ a N columnas de caracteres'a', '7' y' € ', pero la versión de minitech es más natural para mí si el problema está estrechamente relacionado con _number_ representaciones. – sarnold

+0

Aquí hay una versión modificada de este código que he usado (a veces genera arte ASCII aleatorio: D) 'código'5. veces puts (1..7) .map {rand (2)} .join end'code ' – Delta

10

La mejor manera de resolver esto es probablemente para hacer la conversión de base:

someNumber = rand(1 << 7) # Seven digits, max; 1 << 7 is 10000000 in binary. 

puts someNumber.to_s(2).ljust(7, '0') # 10110100, e.g. 
+0

¿por qué ljust 4 y no 7? – DGM

+0

@DGM: tengo * realmente * dedos grandes;) – Ryan

+0

por suerte, obtuve una salida de "0000": D – DGM

1

Rubí no entiende de sus rand() entradas que desee números con formato concreto.

En vez de generar cada dígito al azar (rand(2)) y construir el número completo de siete variables como esta. Imprima el resultado en una línea propia y luego reinicie el ciclo.

Otra opción es generar un número aleatorio entre 0 y 127 y luego formatearlo para salida binaria. Esto pasa mucho menos tiempo en el generador de números aleatorios y reduce drásticamente las variables en su programa.

Cualquiera de los dos enfoques está bien para un programa de aprendizaje. Pruebe ambos y vea qué versión prefiere. Trata de entender por qué prefieres una forma sobre otra.

+0

¿alguien podría decirme cómo hacer la opción 2? – Delta

+0

[La respuesta de Minitech] (http://stackoverflow.com/a/11111899/377270) tiene eso muy bien cubierto. :) No esperaba convertir el número a binario para ser tan simple como 'to_s (2)'. – sarnold

2

Derivación de respuesta de @ MiniTech

5.times { puts "%07b" % rand(128) } 
1

He aquí un método que genera un número arbitrario (por defecto 1) de números binarios de una longitud especificada:

def random_binary(length, n=1) 
    raise ArgumentError if n < 1 
    (1..n).map { "%0#{length}b" % rand(2**length) } 
end 

random_binary(7, 5) 
#=> ["0011100", "1001010", "0101111", "0010101", "1100101"] 
Cuestiones relacionadas