ruby-on-rails - longitud - metodos en ruby
Cómo obtener un número aleatorio en Ruby (17)
¿Cómo genero un número aleatorio entre 0
y n
?
¿Que tal este?
num = Random.new
num.rand(1..n)
Bueno, lo descubrí. Aparentemente hay una función incorporada (?) Llamada rand:
rand(n + 1)
Si alguien responde con una respuesta más detallada, la marcaré como la respuesta correcta.
Este enlace va a ser útil con respecto a esto;
http://ruby-doc.org/core-1.9.3/Random.html
Y un poco más de claridad a continuación sobre los números aleatorios en ruby;
Generar un número entero de 0 a 10.
puts (rand() * 10).to_i
Genera un número del 0 al 10 de una manera más legible
puts rand(10)
Genera un número del 10 al 15, incluyendo 15
puts rand(10..15)
Números aleatorios no aleatorios
Genera la misma secuencia de números cada vez que se ejecuta el programa
srand(5)
Generar 10 números aleatorios.
puts (0..10).map{rand(0..10)}
La respuesta más simple a la pregunta:
rand(0..n)
No te olvides de sembrar el RNG con srand () primero.
Pruebe array#shuffle
método de aleatoriedad de array#shuffle
para la aleatorización
array = (1..10).to_a
array.shuffle.first
Puedes generar un número aleatorio con el método rand
. El argumento pasado al método rand
debe ser un integer
o un range
, y devuelve un número aleatorio correspondiente dentro del rango:
rand(9) # this generates a number between 0 to 8
rand(0 .. 9) # this generates a number between 0 to 9
rand(1 .. 50) # this generates a number between 1 to 50
#rand(m .. n) # m is the start of the number range, n is the end of number range
Que hay de esto
n = 3
(0..n).to_a.sample
Si bien puedes usar rand(42-10) + 10
para obtener un número aleatorio entre 10
y 42
(donde 10 es inclusivo y 42 exclusivo), hay una mejor manera desde Ruby 1.9.3, donde puedes llamar:
rand(10...42) # => 13
Disponible para todas las versiones de Ruby al requerir mi gema de backports
.
Ruby 1.9.2 también introdujo la clase Random
para que pueda crear sus propios objetos generadores de números aleatorios y tiene una API agradable:
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
La clase Random
sí misma actúa como un generador aleatorio, por lo que llama directamente:
Random.rand(10...42) # => same as rand(10...42)
Notas sobre Random.new
En la mayoría de los casos, lo más simple es usar rand
o Random.rand
. Crear un nuevo generador aleatorio cada vez que desee un número aleatorio es una idea realmente mala . Si hace esto, obtendrá las propiedades aleatorias del algoritmo de siembra inicial que son atroces en comparación con las propiedades del generador aleatorio en sí .
Si usa Random.new
, debería llamarlo tan raramente como sea posible , por ejemplo, una vez como MyApp::Random = Random.new
y usarlo en cualquier otro lugar.
Los casos en los que Random.new
es útil son los siguientes:
- estás escribiendo una gema y no quieres interferir con la secuencia de
rand
/Random.rand
que seRandom.rand
los programas principales - quieres secuencias reproducibles separadas de números aleatorios (por ejemplo, uno por hilo)
- desea poder guardar y reanudar una secuencia reproducible de números aleatorios (tan fácil como los objetos
Random
pueden calcularse)
Si no solo busca un número, sino también un hex o un uuid, vale la pena mencionar que el módulo SecureRandom
encontró su camino desde ActiveSupport
hasta el núcleo de ruby en 1.9.2+. Así que sin la necesidad de un marco completo:
require ''securerandom''
p SecureRandom.random_number(100) #=> 15
p SecureRandom.random_number(100) #=> 88
p SecureRandom.random_number #=> 0.596506046187744
p SecureRandom.random_number #=> 0.350621695741409
p SecureRandom.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"
Se documenta aquí: Ruby 1.9.3 - Módulo: SecureRandom (lib / securerandom.rb)
Simplemente puedes usar random_number
.
Si un entero positivo se da como n, random_number
devuelve un entero: 0 <= random_number
<n.
Úsalo así:
any_number = SecureRandom.random_number(100)
La salida será cualquier número entre 0 y 100.
Tal vez te ayude. Yo uso esto en mi aplicación
https://github.com/rubyworks/facets
class String
# Create a random String of given length, using given character set
#
# Character set is an Array which can contain Ranges, Arrays, Characters
#
# Examples
#
# String.random
# => "D9DxFIaqR3dr8Ct1AfmFxHxqGsmA4Oz3"
#
# String.random(10)
# => "t8BIna341S"
#
# String.random(10, [''a''..''z''])
# => "nstpvixfri"
#
# String.random(10, [''0''..''9''] )
# => "0982541042"
#
# String.random(10, [''0''..''9'',''A''..''F''] )
# => "3EBF48AD3D"
#
# BASE64_CHAR_SET = ["A".."Z", "a".."z", "0".."9", ''_'', ''-'']
# String.random(10, BASE64_CHAR_SET)
# => "xM_1t3qcNn"
#
# SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"]
# BASE91_CHAR_SET = ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS]
# String.random(10, BASE91_CHAR_SET)
# => "S(Z]z,J{v;"
#
# CREDIT: Tilo Sloboda
#
# SEE: https://gist.github.com/tilo/3ee8d94871d30416feba
#
# TODO: Move to random.rb in standard library?
def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten
Array.new(len){ chars.sample }.join
end
end
Funciona bien para mí
Una forma fácil de obtener un número aleatorio en ruby es,
def random
(1..10).to_a.sample.to_s
end
Usar rand(range)
Si necesitara un entero aleatorio para simular una tirada de un dado de seis caras, usaría:
1 + rand(6)
. Un rollo en dados se podría simular con2 + rand(6) + rand(6)
.Finalmente, si solo necesitas un flotador aleatorio, simplemente llama a
rand
sin argumentos.
Como Marc-André Lafortune menciona en su respuesta a continuación (subir para votar) , Ruby 1.9.2 tiene su propia clase Random
(que Marc-André ayudó a depurar , de ahí el objetivo de 1.9.2 para esa característica).
Por ejemplo, en este juego donde necesitas adivinar 10 números , puedes inicializarlos con:
10.times.map{ 20 + Random.rand(11) }
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]
Nota:
Usar
Random.new.rand(20..30)
(usarRandom.new
) en general no sería una buena idea, como lo explica en detalle (nuevamente) Marc-André Lafortune , en su respuesta (otra vez).Pero si no usa
Random.new
, entonces el método de la claserand
solo toma un valormax
, no unRange
, como lo indica la banister (energéticamente) en el comentario (y como se documenta en los documentos paraRandom
). Solo el método de instancia puede tomar unRange
, como se ilustra al generar un número aleatorio con 7 dígitos .
Es por esto que el equivalente de Random.new.rand(20..30)
sería 20 + Random.rand(11)
, ya que Random.rand(int)
devuelve "un entero aleatorio mayor o igual a cero y menor que argumento ”. 20..30
incluye 30, necesito un número aleatorio entre 0 y 11, excluyendo 11.
puedes hacer rand (rango)
x = rand(1..5)
rango = 10..50
rand (rango)
o
range.to_a.sample
o
range.to_a.shuffle (esto mezclará toda la matriz y puede elegir un número aleatorio por primera o última o cualquiera de esta matriz para elegir uno aleatorio)
rand(6) #=> gives a random number between 0 and 6 inclusively
rand(1..6) #=> gives a random number between 1 and 6 inclusively
Tenga en cuenta que la opción de rango solo está disponible en las versiones más nuevas (más de 1.9, creo) de ruby.