Odpowiedzi:
Posługiwać się rand(range)
Jeśli potrzebne losową liczbę całkowitą symulować rolkę sześciu jednostronnej matrycy, można użyć:
1 + rand(6)
. Można symulować rzut w bzdury2 + rand(6) + rand(6)
.Wreszcie, jeśli potrzebujesz tylko losowej liczby zmiennoprzecinkowej, po prostu zadzwoń
rand
bez argumentów.
Jak wspomina Marc-André Lafortune w swojej odpowiedzi poniżej (idź dalej) , Ruby 1.9.2 ma swoją Random
klasę (sam Marc-André pomógł w debugowaniu , stąd cel 1.9.2 dla tej funkcji).
Na przykład w tej grze, w której musisz odgadnąć 10 liczb , możesz je zainicjować za pomocą:
10.times.map{ 20 + Random.rand(11) }
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]
Uwaga:
Używanie Random.new.rand(20..30)
(używanie Random.new
) ogólnie nie byłoby dobrym pomysłem, jak szczegółowo wyjaśniono (ponownie) Marc-André Lafortune , w swojej odpowiedzi (ponownie).
Ale jeśli nie użyjesz Random.new
, to metoda klasowarand
przyjmuje tylko max
wartość, a nie Range
, jak wskazuje banister (energetycznie) w komentarzu (i jak udokumentowano w dokumentacji dlaRandom
). Tylko metoda instancji może przyjąć Range
, jak pokazano, generując losową liczbę z 7 cyframi .
Dlatego odpowiednikiem Random.new.rand(20..30)
byłoby 20 + Random.rand(11)
, ponieważ Random.rand(int)
zwraca „losową liczbę całkowitą większą lub równą zero i mniejszą niż argument ”. 20..30
obejmuje 30, muszę wymyślić losową liczbę od 0 do 11, z wyłączeniem 11.
Random
klasie, ale to straszny pomysł dzwonić Random.new
wiele razy, tak jak w twoim przykładzie. Zredagowałem moją odpowiedź, aby to stwierdzić.
Random.rand
ma przyjąć szereg, właściwie. (
Chociaż możesz użyć, rand(42-10) + 10
aby uzyskać losowy numer pomiędzy 10
i 42
(gdzie 10 jest włącznie, a 42 wyłącznie), istnieje lepszy sposób od Ruby 1.9.3, w którym możesz dzwonić:
rand(10...42) # => 13
Dostępne dla wszystkich wersji Ruby, wymagając mojego backports
klejnotu.
Ruby 1.9.2 również wprowadziło Random
klasę, dzięki czemu możesz tworzyć własne obiekty generatora liczb losowych i ma ładne API:
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
Sama Random
klasa działa jak generator losowy, więc wywołujesz bezpośrednio:
Random.rand(10...42) # => same as rand(10...42)
Uwagi na temat Random.new
W większości przypadków najprostszym jest użycie rand
lub Random.rand
. Tworzenie nowego losowego generatora za każdym razem, gdy chcesz losową liczbę, jest naprawdę złym pomysłem . Jeśli to zrobisz, otrzymasz losowe właściwości początkowego algorytmu inicjowania, które są okropne w porównaniu do właściwości samego generatora losowego .
Jeśli używasz Random.new
, powinieneś wywoływać go tak rzadko, jak to możliwe , na przykład raz MyApp::Random = Random.new
i używać go wszędzie indziej.
Przypadki, w których Random.new
jest pomocne są następujące:
rand
/ Random.rand
, na której mogą polegać główne programyRandom
obiekty mogą być zestawiane)backports
klejnot to po prostu zbiór metod, które są nowe w RUby 1.8.7, 1.9.1, 1.9.2, ale zaimplementowane w Ruby. Używam RubySpec, aby zapewnić zgodność wyników z Ruby.
Random.rand(10..42)
nie działa. Metoda Random.rand
klasy nie akceptuje zakresu. (Ruby 1.9.2p180)
Jeśli szukasz nie tylko liczby, ale także heksa lub uuida, warto wspomnieć, że SecureRandom
moduł znalazł drogę ActiveSupport
do rubinowego rdzenia w wersji 1.9.2+. Więc bez potrzeby tworzenia pełnych ram:
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"
Jest to udokumentowane tutaj: Ruby 1.9.3 - Moduł: SecureRandom (lib / securerandom.rb)
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
nie ma zasięgu, więc nie. Prawdopodobnie chcesz coś takiego SecureRandom.random_number(10_000)
(dla 0-9999) lub SecureRandom.random_number(9_000)+1_000
(dla 1000-9999).
rand
Metodą można wygenerować liczbę losową . Argument przekazany do rand
metody powinien mieć wartość integer
a lub a range
i zwraca odpowiednią liczbę losową z zakresu:
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)
odczytów jest wyraźniejsze niż w przypadku najlepszych odpowiedzi rand(6)+1
.
Cóż, wymyśliłem to. Najwyraźniej istnieje wbudowana funkcja (?) O nazwie rand:
rand(n + 1)
Jeśli ktoś odpowie bardziej szczegółową odpowiedzią, oznaczę ją jako poprawną odpowiedź.
Najprostsza odpowiedź na pytanie:
rand(0..n)
Możesz po prostu użyć random_number
.
Jeśli dodatnia liczba całkowita jest podana jako n, random_number
zwraca liczbę całkowitą: 0 <= random_number
<n.
Użyj tego w ten sposób:
any_number = SecureRandom.random_number(100)
Wyjście będzie dowolnej liczby od 0 do 100.
rand(6) #=> gives a random number between 0 and 6 inclusively
rand(1..6) #=> gives a random number between 1 and 6 inclusively
Zauważ, że opcja zasięgu jest dostępna tylko w nowszych (1.9+) wersjach ruby.
ruby 1.9.3+
. Nie zadziałało, 1.9.2
kiedy przynajmniej próbowałem.
możesz zrobić rand (zakres)
x = rand(1..5)
Ten link będzie pomocny w tym zakresie;
http://ruby-doc.org/core-1.9.3/Random.html
I jeszcze więcej jasności poniżej liczb losowych w rubinie;
Wygeneruj liczbę całkowitą od 0 do 10
puts (rand() * 10).to_i
Wygeneruj liczbę od 0 do 10 w bardziej czytelny sposób
puts rand(10)
Wygeneruj liczbę od 10 do 15, w tym 15
puts rand(10..15)
Nieprzypadkowe liczby losowe
Generuj tę samą sekwencję liczb przy każdym uruchomieniu programu
srand(5)
Wygeneruj 10 liczb losowych
puts (0..10).map{rand(0..10)}
Może ci to pomoże. Używam tego w mojej aplikacji
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
Działa dla mnie dobrze
Co powiesz na ten?
num = Random.new
num.rand(1..n)
Wypróbuj array#shuffle
metodę randomizacji
array = (1..10).to_a
array.shuffle.first
.shuffle.first
ją .sample
!
srand <some_number>
przed napisaniemrand
kodu da ci deterministyczną (tj. Powtarzalną) pseudolosową sekwencję, jeśli jej potrzebujesz. ruby-doc.org/core-2.5.6/Random.html#method-c-srand