Risposte:
Uso rand(range)
Dai numeri casuali di Ruby :
Se avete bisogno di un intero casuale per simulare un lancio di un dado a sei facce, utilizza:
1 + rand(6)
. È possibile simulare un lancio di dadi2 + rand(6) + rand(6)
.Infine, se hai solo bisogno di un float casuale, chiama semplicemente
rand
senza argomenti.
Come Marc-André Lafortune menziona nella sua risposta di seguito (vai a votarla) , Ruby 1.9.2 ha una sua Random
classe (che lo stesso Marc-André ha contribuito al debug , quindi l' obiettivo 1.9.2 per quella caratteristica).
Ad esempio, in questo gioco in cui devi indovinare 10 numeri , puoi inizializzarli con:
10.times.map{ 20 + Random.rand(11) }
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]
Nota:
Usare Random.new.rand(20..30)
(usare Random.new
) in generale non sarebbe una buona idea, come spiegato in dettaglio (di nuovo) da Marc-André Lafortune , nella sua risposta (di nuovo).
Ma se non lo usi Random.new
, il metodo di classerand
assume solo un max
valore, non un Range
, come la ringhiera (energicamente) sottolinea nel commento (e come documentato nei documenti perRandom
). Solo il metodo di istanza può prendere un Range
, come illustrato generando un numero casuale con 7 cifre .
Questo è il motivo per cui l'equivalente di Random.new.rand(20..30)
sarebbe 20 + Random.rand(11)
, poiché Random.rand(int)
restituisce "un numero intero casuale maggiore o uguale a zero e inferiore all'argomento ". 20..30
include 30, devo trovare un numero casuale compreso tra 0 e 11, escluso 11.
Random
classe, ma è una pessima idea chiamare Random.new
più volte come nel tuo esempio. Ho modificato la mia risposta per affermarlo.
Random.rand
non accetta un intervallo, in realtà. (Dall'1.9.3, credo.)
Mentre puoi usare rand(42-10) + 10
per ottenere un numero casuale tra 10
e 42
(dove 10 è inclusivo e 42 esclusivo), c'è un modo migliore rispetto a Ruby 1.9.3, dove puoi chiamare:
rand(10...42) # => 13
Disponibile per tutte le versioni di Ruby richiedendo la mia backports
gemma.
Ruby 1.9.2 ha anche introdotto la Random
classe in modo da poter creare i propri oggetti generatori di numeri casuali e ha una bella API:
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
La Random
classe stessa funge da generatore casuale, quindi chiami direttamente:
Random.rand(10...42) # => same as rand(10...42)
Note su Random.new
Nella maggior parte dei casi, il più semplice è usare rand
o Random.rand
. Creare un nuovo generatore casuale ogni volta che vuoi un numero casuale è una pessima idea . Se lo fai, otterrai le proprietà casuali dell'algoritmo di seeding iniziale che sono atroci rispetto alle proprietà del generatore casuale stesso .
Se lo usi Random.new
, dovresti quindi chiamarlo il più raramente possibile , ad esempio una volta MyApp::Random = Random.new
e usarlo ovunque.
I casi in cui Random.new
è utile sono i seguenti:
rand
/ su Random.rand
cui i programmi principali potrebbero fare affidamentoRandom
oggetti possono essere smistati)backports
gemma è semplicemente una raccolta di metodi nuovi per RUby 1.8.7, 1.9.1, 1.9.2, ma implementati in Ruby. Uso RubySpec per assicurarmi che i risultati siano compatibili con Ruby.
Random.rand(10..42)
non funziona. Il Random.rand
metodo class non accetta un intervallo. (Ruby 1.9.2p180)
Se non stai solo cercando un numero, ma anche hex o uuid, vale la pena ricordare che il SecureRandom
modulo ha trovato la sua strada dal ActiveSupport
core ruby in 1.9.2+. Quindi senza la necessità di un quadro 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"
È documentato qui: Ruby 1.9.3 - Modulo: SecureRandom (lib / securerandom.rb)
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
non prende una distanza, quindi no. Probabilmente vorresti qualcosa del tipo SecureRandom.random_number(10_000)
(per 0-9999) o SecureRandom.random_number(9_000)+1_000
(per 1000-9999).
È possibile generare un numero casuale con il rand
metodo L'argomento passato al rand
metodo dovrebbe essere un integer
o un range
e restituisce un numero casuale corrispondente all'interno dell'intervallo:
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
rand(1..6)
letture sia più chiaro di quello della risposta migliore rand(6)+1
.
Bene, l'ho capito. Apparentemente esiste una funzione incorporata (?) Chiamata rand:
rand(n + 1)
Se qualcuno risponde con una risposta più dettagliata, la segnerò come risposta corretta.
Risposta più semplice alla domanda:
rand(0..n)
Puoi semplicemente usare random_number
.
Se un numero intero positivo viene dato come n, random_number
restituisce un numero intero: 0 <= random_number
<n.
Usalo in questo modo:
any_number = SecureRandom.random_number(100)
L'output sarà qualsiasi numero compreso tra 0 e 100.
rand(6) #=> gives a random number between 0 and 6 inclusively
rand(1..6) #=> gives a random number between 1 and 6 inclusively
Nota che l'opzione range è disponibile solo nelle versioni più recenti (1.9+ credo) di ruby.
ruby 1.9.3+
. Non ha funzionato 1.9.2
quando ho provato almeno.
intervallo = 10..50
rand (range)
o
range.to_a.sample
o
range.to_a.shuffle (questo mescolerà l'intero array e puoi scegliere un numero casuale dal primo o dall'ultimo o qualsiasi altro da questo array per sceglierne uno casuale)
range.to_a.sample
è una pessima idea quando il campione è grande.
puoi fare rand (range)
x = rand(1..5)
Questo link sarà utile al riguardo;
http://ruby-doc.org/core-1.9.3/Random.html
E un po 'più di chiarezza di seguito sui numeri casuali in rubino;
Genera un numero intero compreso tra 0 e 10
puts (rand() * 10).to_i
Genera un numero da 0 a 10 In un modo più leggibile
puts rand(10)
Genera un numero da 10 a 15, incluso 15
puts rand(10..15)
Numeri casuali non casuali
Genera la stessa sequenza di numeri ogni volta che viene eseguito il programma
srand(5)
Genera 10 numeri casuali
puts (0..10).map{rand(0..10)}
Forse ti aiuta. Lo uso nella mia app
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
Funziona bene per me
Che ne dici di questo?
num = Random.new
num.rand(1..n)
Prova il array#shuffle
metodo per la randomizzazione
array = (1..10).to_a
array.shuffle.first
.shuffle.first
con .sample
!
srand <some_number>
prima di scrivere ilrand
codice ti darà una sequenza pseudo-casuale deterministica (cioè ripetibile), se ne hai bisogno. ruby-doc.org/core-2.5.6/Random.html#method-c-srand