Jak zdobyć losową liczbę w Ruby
Jak wygenerować losową liczbę pomiędzy 0
a n
?
17 answers
Użycie rand(range)
From Ruby Losowe Liczby :
Jeśli potrzebujesz losowej liczby całkowitej do symulacji rolki sześciostronnej matrycy, użyjesz:
1 + rand(6)
. Rolka w kościach może być symulowana za pomocą2 + rand(6) + rand(6)
.Wreszcie, jeśli potrzebujesz tylko losowego float ' a, po prostu wywołaj
rand
bez argumentów.
Jako Marc-André Lafortune wspomina w swoją odpowiedź poniżej (idź do góry), Ruby 1.9.2 posiada własną klasę Random
(Sam Marc-André pomógł debugować , stąd cel 1.9.2 dla tej funkcji).
10.times.map{ 20 + Random.rand(11) }
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]
Uwaga:
Użycie
Random.new.rand(20..30)
(użycieRandom.new
) ogólnie nie byłoby dobrym pomysłem, jak wyjaśniono szczegółowo (ponownie) przez Marc-André Lafortune, W jego odpowiedź (ponownie).Ale jeśli nie używasz
Random.new
, następnie metoda klasyrand
przyjmuje tylkomax
wartość, a nieRange
, Jak banister (energetycznie) wskazuje w komentarzu (i jak udokumentowano w docs dlaRandom
). Tylko metoda instancji może przyjąćRange
, Jak to ilustruje wygenerować liczbę losową z 7 cyframi.
Dlatego odpowiednikiem Random.new.rand(20..30)
będzie 20 + Random.rand(11)
, ponieważ Random.rand(int)
zwraca " losową liczbę całkowitą większą lub równą zeru i mniejszą niż argument ."20..30
zawiera 30, muszę wymyślić losową liczbę z zakresu od 0 do 11, z wyłączeniem 11.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 14:35:56
Podczas gdy możesz użyć rand(42-10) + 10
, aby uzyskać losową liczbę między 10
a 42
(Gdzie 10 JEST WŁĄCZNIE i 42 jest wyłączne), istnieje lepszy sposób od Ruby 1.9.3, w którym możesz wywołać:
rand(10...42) # => 13
Dostępne dla wszystkich wersji Ruby wymagając mojego backports
gem.
Ruby 1.9.2 wprowadził również klasę Random
, 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"
Klasa sama w sobie działa jak generator losowy, więc wywołanie bezpośrednio:
Random.rand(10...42) # => same as rand(10...42)
uwagi na Random.new
W większości przypadków najprostszym jest użycie rand
lub Random.rand
. Tworzenie nowego generatora losowego 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 siewu, które są okropne w porównaniu z właściwościami samego generatora losowego .
Jeśli używasz Random.new
, powinieneś więc nazywać go tak rzadko jak możliwe , na przykład raz jako MyApp::Random = Random.new
i używać go wszędzie indziej.
Przypadki, w których Random.new
jest pomocne są następujące:
- piszesz klejnot i nie chcesz ingerować w sekwencję
rand
/Random.rand
że główne programy mogą polegać na - chcesz oddzielne powtarzalne ciągi liczb losowych (powiedzmy jeden na wątek)
- chcesz być w stanie zapisać i wznowić powtarzalny ciąg liczb losowych (łatwo jak
Random
obiekty mogą marshalled)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-12 17:38:27
Jeśli szukasz nie tylko liczby, ale także hex lub uuid, warto wspomnieć, że moduł SecureRandom
znalazł drogę z ActiveSupport
do rdzenia ruby w 1.9.2+. Tak więc bez potrzeby pełnego frameworka:
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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-08 08:42:19
Możesz wygenerować losową liczbę za pomocą metody rand
. Argument przekazany do metody rand
powinien być integer
lub range
i zwraca odpowiednią liczbę losową w zakresie:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 00:54:21
Rozgryzłem to. Najwidoczniej jest wbudowany (?) funkcja o nazwie rand:
rand(n + 1)
Jeśli ktoś odpowie bardziej szczegółowo, zaznaczę to jako poprawną odpowiedź.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-13 18:10:10
A co z tym?
n = 3
(0..n).to_a.sample
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-23 06:02:22
Najprostsza odpowiedź na pytanie:
rand(0..n)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-20 10:45:54
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 range jest dostępna tylko w nowszych (1.9+ jak sądzę) wersjach Rubiego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-15 23:31:45
Range = 10..50
Rand (range)
LUB
Range. To_a. sample
LUB
Range.To_a.shuffle(spowoduje to przetasowanie całej tablicy i możesz wybrać losową liczbę według pierwszej lub ostatniej lub dowolną z tej tablicy, aby wybrać losową)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-29 10:32:32
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
Użyj go tak:
any_number = SecureRandom.random_number(100)
Wyjściem będzie dowolna liczba z zakresu od 0 do 100.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-16 11:58:57
Ten link będzie pomocny w tej sprawie;
Http://ruby-doc.org/core-1.9.3/Random.html
I trochę więcej jasności poniżej nad losowymi liczbami w ruby;
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)
Liczby Losowe
Generuj ten sam ciąg liczb co czas program jest uruchamiany
srand(5)
Wygeneruj 10 losowych liczb
puts (0..10).map{rand(0..10)}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-24 17:38:49
Możesz zrobić rand (range)
x = rand(1..5)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-22 23:09:00
Wypróbuj array#shuffle
metodę randomizacji
array = (1..10).to_a
array.shuffle.first
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-23 18:15:29
Może to ci 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
It works fine for me
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-11 13:59:43
A może ten?
num = Random.new
num.rand(1..n)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-11 14:31:35
Łatwy sposób na uzyskanie liczby losowej w Rubim jest,
def random
(1..10).to_a.sample.to_s
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 10:04:47
Nie zapomnij najpierw zasiać RNG za pomocą srand () .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-13 18:15:52