Jak zdobyć losową liczbę w Ruby

Jak wygenerować losową liczbę pomiędzy 0 a n?

Author: techdreams, 2008-10-13

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

Na przykład, w tej grze, w której musisz odgadnąć 10 liczb, możesz zainicjować je za pomocą:
10.times.map{ 20 + Random.rand(11) } 
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]

Uwaga:

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.

 889
Author: VonC,
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)
 575
Author: Marc-André Lafortune,
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)

 44
Author: Thomas Fankhauser,
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
 34
Author: MattD,
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ź.

 21
Author: Mark A. Nicolosi,
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
 19
Author: Rimian,
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)
 11
Author: sqrcompass,
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.

 6
Author: Josh,
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ą)

 6
Author: sumit,
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.

 5
Author: techdreams,
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)}
 4
Author: Sam,
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)
 3
Author: Snifferdog,
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
 2
Author: LuckyElf,
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

Https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb

It works fine for me

 2
Author: amarradi,
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)
 2
Author: Juan Dela Cruz,
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
 1
Author: ysk,
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 () .

 0
Author: Liebach,
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