Jak wygenerować losową liczbę między 0
i n
?
ruby-on-rails
ruby
ruby-on-rails-3
ruby-on-rails-4
random
Mark A. Nicolosi
źródło
źródło
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-srandOdpowiedzi:
Posługiwać się
rand(range)
Z rubinowych liczb losowych :
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ą:
Uwaga:
Używanie
Random.new.rand(20..30)
(używanieRandom.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 tylkomax
wartość, a nieRange
, 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łoby20 + 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.źródło
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ędzy10
i42
(gdzie 10 jest włącznie, a 42 wyłącznie), istnieje lepszy sposób od Ruby 1.9.3, w którym możesz dzwonić: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:Sama
Random
klasa działa jak generator losowy, więc wywołujesz bezpośrednio:Uwagi na temat
Random.new
W większości przypadków najprostszym jest użycie
rand
lubRandom.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 razMyApp::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)źródło
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. MetodaRandom.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:Jest to udokumentowane tutaj: Ruby 1.9.3 - Moduł: SecureRandom (lib / securerandom.rb)
źródło
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
nie ma zasięgu, więc nie. Prawdopodobnie chcesz coś takiegoSecureRandom.random_number(10_000)
(dla 0-9999) lubSecureRandom.random_number(9_000)+1_000
(dla 1000-9999).rand
Metodą można wygenerować liczbę losową . Argument przekazany dorand
metody powinien mieć wartośćinteger
a lub arange
i zwraca odpowiednią liczbę losową z zakresu:źródło
rand(1..6)
odczytów jest wyraźniejsze niż w przypadku najlepszych odpowiedzirand(6)+1
.Cóż, wymyśliłem to. Najwyraźniej istnieje wbudowana funkcja (?) O nazwie rand:
Jeśli ktoś odpowie bardziej szczegółową odpowiedzią, oznaczę ją jako poprawną odpowiedź.
źródło
A co z tym?
źródło
rand
O (1).Najprostsza odpowiedź na pytanie:
źródło
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:
Wyjście będzie dowolnej liczby od 0 do 100.
źródło
Zauważ, że opcja zasięgu jest dostępna tylko w nowszych (1.9+) wersjach ruby.
źródło
ruby 1.9.3+
. Nie zadziałało,1.9.2
kiedy przynajmniej próbowałem.zakres = 10..50
rand (zakres)
lub
zakres. do. próbki
lub
range.to_a.shuffle (to przetasuje całą tablicę i możesz wybrać losową liczbę według pierwszego, ostatniego lub dowolnej z tej tablicy, aby wybrać losową)
źródło
range.to_a.sample
to okropny pomysł, gdy próbka jest duża.możesz zrobić rand (zakres)
źródło
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
Wygeneruj liczbę od 0 do 10 w bardziej czytelny sposób
Wygeneruj liczbę od 10 do 15, w tym 15
Nieprzypadkowe liczby losowe
Generuj tę samą sekwencję liczb przy każdym uruchomieniu programu
Wygeneruj 10 liczb losowych
źródło
Prostym sposobem na uzyskanie losowej liczby w rubinie jest,
źródło
Może ci to pomoże. Używam tego w mojej aplikacji
https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb
Działa dla mnie dobrze
źródło
Co powiesz na ten?
źródło
Wypróbuj
array#shuffle
metodę randomizacjiźródło
.shuffle.first
ją.sample
!Nie zapomnij najpierw zaszczepić RNG srand () .
źródło