Wie generiere ich eine Zufallszahl zwischen 0
und n
?
ruby-on-rails
ruby
ruby-on-rails-3
ruby-on-rails-4
random
Mark A. Nicolosi
quelle
quelle
srand <some_number>
vor dem Schreiben vonrand
Code verwenden, erhalten Sie eine deterministische (dh wiederholbare) Pseudozufallssequenz, falls Sie diese benötigen. ruby-doc.org/core-2.5.6/Random.html#method-c-srandAntworten:
Verwenden
rand(range)
Aus Ruby-Zufallszahlen :
Wie Marc-André Lafortune in seiner Antwort unten erwähnt (siehe oben) , hat Ruby 1.9.2 eine eigene
Random
Klasse (die Marc-André selbst beim Debuggen unterstützt hat , daher das Ziel 1.9.2 für diese Funktion).In diesem Spiel , in dem Sie 10 Zahlen erraten müssen , können Sie diese beispielsweise initialisieren mit:
Hinweis:
Das Verwenden
Random.new.rand(20..30)
(VerwendenRandom.new
) im Allgemeinen wäre keine gute Idee, wie Marc-André Lafortune in seiner Antwort (erneut) ausführlich (erneut) erläutert hat .Wenn Sie dies jedoch nicht verwenden
Random.new
, nimmt die Klassenmethoderand
nur einenmax
Wert an, nicht einenRange
, wie das Geländer (energetisch) im Kommentar (und wie in den Dokumenten fürRandom
dokumentiert) hervorhebt . Nur die Instanzmethode kann a annehmenRange
, wie durch Generieren einer Zufallszahl mit 7 Ziffern veranschaulicht .Aus diesem Grunde ist die äquivalent
Random.new.rand(20..30)
wäre20 + Random.rand(11)
, daRandom.rand(int)
returns „eine zufällige ganze Zahl größer oder gleich null und kleiner als das Argument .“20..30
Enthält 30, muss ich eine Zufallszahl zwischen 0 und 11 finden, ausgenommen 11.quelle
Random
Klasse zu erwähnen , aber es ist eine schreckliche Idee,Random.new
wie in Ihrem Beispiel mehrmals anzurufen . Ich habe meine Antwort bearbeitet, um dies anzugeben.Random.rand
nicht akzeptiert eine Reihe, eigentlich. (Seit 1.9.3, glaube ich.)Während Sie verwenden können
rand(42-10) + 10
, um eine Zufallszahl zwischen10
und42
(wobei 10 inklusive und 42 exklusiv ist) zu erhalten, gibt es seit Ruby 1.9.3 einen besseren Weg, wo Sie anrufen können:Verfügbar für alle Versionen von Ruby, wenn Sie meinen
backports
Edelstein benötigen .Ruby 1.9.2 hat auch die
Random
Klasse eingeführt, damit Sie Ihre eigenen Zufallszahlengeneratorobjekte erstellen können, und verfügt über eine nette API:Die
Random
Klasse selbst fungiert als Zufallsgenerator, sodass Sie direkt aufrufen:Anmerkungen zu
Random.new
In den meisten Fällen ist es am einfachsten,
rand
oder zu verwendenRandom.rand
. Es ist eine wirklich schlechte Idee, jedes Mal einen neuen Zufallsgenerator zu erstellen, wenn Sie eine Zufallszahl möchten . Wenn Sie dies tun, erhalten Sie die zufälligen Eigenschaften des anfänglichen Seeding-Algorithmus, die im Vergleich zu den Eigenschaften des Zufallsgenerators selbst grausam sind .Wenn Sie verwenden
Random.new
, sollten Sie es daher so selten wie möglich aufrufen , zum Beispiel einmal wieMyApp::Random = Random.new
und überall verwenden.Random.new
Folgende Fälle sind hilfreich:rand
/ nicht störenRandom.rand
die Hauptprogramme möglicherweise verlassenRandom
Objekte gemarshallt werden können).quelle
backports
Juwel ist einfach eine Sammlung von Methoden, die neu in RUby 1.8.7, 1.9.1, 1.9.2 sind, aber in Ruby implementiert sind. Ich verwende RubySpec, um sicherzustellen, dass die Ergebnisse mit Ruby kompatibel sind.Random.rand(10..42)
funktioniert nicht. DieRandom.rand
Klassenmethode akzeptiert keinen Bereich. (Ruby 1.9.2p180)Wenn Sie nicht nur nach einer Zahl suchen, sondern auch nach Hex oder UUID, ist es erwähnenswert, dass das
SecureRandom
ModulActiveSupport
in 1.9.2+ seinen Weg vom Rubinkern gefunden hat. Also ohne die Notwendigkeit eines vollständigen Frameworks:Es ist hier dokumentiert: Ruby 1.9.3 - Modul: SecureRandom (lib / securerandom.rb)
quelle
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
nimmt keine Reichweite, also nein. Sie möchten wahrscheinlich etwas wieSecureRandom.random_number(10_000)
(für 0-9999) oderSecureRandom.random_number(9_000)+1_000
(für 1000-9999).Mit der
rand
Methode können Sie eine Zufallszahl generieren . Das an dierand
Methode übergebene Argument sollte eininteger
oder a seinrange
und gibt eine entsprechende Zufallszahl innerhalb des Bereichs zurück:quelle
rand(1..6)
Lesungen sind klarer als die der Top-Antwortenrand(6)+1
.Nun, ich habe es herausgefunden. Anscheinend gibt es eine eingebaute (?) Funktion namens rand:
Wenn jemand mit einer detaillierteren Antwort antwortet, werde ich dies als die richtige Antwort markieren.
quelle
Was ist damit?
quelle
rand
es O (1) ist.Einfachste Antwort auf die Frage:
quelle
Sie können einfach verwenden
random_number
.Wenn eine positive Ganzzahl als n angegeben wird, wird
random_number
eine Ganzzahl zurückgegeben: 0 <=random_number
<n.Verwenden Sie es so:
Die Ausgabe ist eine beliebige Zahl zwischen 0 und 100.
quelle
Beachten Sie, dass die Bereichsoption nur in neueren (glaube ich 1.9+) Versionen von Ruby verfügbar ist.
quelle
ruby 1.9.3+
. Es hat nicht funktioniert,1.9.2
als ich es zumindest versucht habe.Bereich = 10..50
Rand (Reichweite)
oder
range.to_a.sample
oder
range.to_a.shuffle (dies mischt das gesamte Array und Sie können eine Zufallszahl als erste oder letzte oder eine beliebige aus diesem Array auswählen, um eine zufällige auszuwählen.)
quelle
range.to_a.sample
ist eine schreckliche Idee, wenn die Stichprobe groß ist.Sie können Rand (Reichweite) tun
quelle
Dieser Link wird diesbezüglich hilfreich sein.
http://ruby-doc.org/core-1.9.3/Random.html
Und etwas mehr Klarheit über die Zufallszahlen in Rubin;
Generieren Sie eine Ganzzahl von 0 bis 10
Generieren Sie eine Zahl von 0 bis 10 besser lesbar
Generieren Sie eine Zahl von 10 bis 15, einschließlich 15
Nicht zufällige Zufallszahlen
Generieren Sie bei jeder Programmausführung dieselbe Zahlenfolge
Generiere 10 Zufallszahlen
quelle
Einfache Möglichkeit, Zufallszahlen in Rubin zu erhalten, ist:
quelle
Vielleicht hilft es dir. Ich benutze dies in meiner App
https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb
Es funktioniert gut für mich
quelle
Wie wäre es mit diesem?
quelle
Versuchen Sie die
array#shuffle
Methode zur Randomisierungquelle
.shuffle.first
mit.sample
!Vergessen Sie nicht, das RNG zuerst mit srand () zu setzen .
quelle