Antworten:
Verwenden rand(range)
Aus Ruby-Zufallszahlen :
Wenn Sie eine zufällige Ganzzahl benötigen, um einen Wurf eines sechsseitigen Würfels zu simulieren, verwenden Sie :
1 + rand(6)
. Ein Roll-in-Craps könnte mit simuliert werden2 + rand(6) + rand(6)
.Wenn Sie nur einen zufälligen Float benötigen, rufen Sie einfach
rand
ohne Argumente auf.
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:
10.times.map{ 20 + Random.rand(11) }
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]
Hinweis:
Das Verwenden Random.new.rand(20..30)
(Verwenden Random.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 einen max
Wert an, nicht einen Range
, wie das Geländer (energetisch) im Kommentar (und wie in den Dokumenten fürRandom
dokumentiert) hervorhebt . Nur die Instanzmethode kann a annehmen Range
, wie durch Generieren einer Zufallszahl mit 7 Ziffern veranschaulicht .
Aus diesem Grunde ist die äquivalent Random.new.rand(20..30)
wäre 20 + Random.rand(11)
, da Random.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.
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 zwischen 10
und 42
(wobei 10 inklusive und 42 exklusiv ist) zu erhalten, gibt es seit Ruby 1.9.3 einen besseren Weg, wo Sie anrufen können:
rand(10...42) # => 13
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:
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
Die Random
Klasse selbst fungiert als Zufallsgenerator, sodass Sie direkt aufrufen:
Random.rand(10...42) # => same as rand(10...42)
Anmerkungen zu Random.new
In den meisten Fällen ist es am einfachsten, rand
oder zu verwenden Random.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).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. Die Random.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
Modul ActiveSupport
in 1.9.2+ seinen Weg vom Rubinkern gefunden hat. Also ohne die Notwendigkeit eines vollständigen Frameworks:
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"
Es ist hier dokumentiert: Ruby 1.9.3 - Modul: SecureRandom (lib / securerandom.rb)
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
nimmt keine Reichweite, also nein. Sie möchten wahrscheinlich etwas wie SecureRandom.random_number(10_000)
(für 0-9999) oder SecureRandom.random_number(9_000)+1_000
(für 1000-9999).
Mit der rand
Methode können Sie eine Zufallszahl generieren . Das an die rand
Methode übergebene Argument sollte ein integer
oder a sein range
und gibt eine entsprechende Zufallszahl innerhalb des Bereichs zurück:
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)
Lesungen sind klarer als die der Top-Antworten rand(6)+1
.
Nun, ich habe es herausgefunden. Anscheinend gibt es eine eingebaute (?) Funktion namens rand:
rand(n + 1)
Wenn jemand mit einer detaillierteren Antwort antwortet, werde ich dies als die richtige Antwort markieren.
Einfachste Antwort auf die Frage:
rand(0..n)
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:
any_number = SecureRandom.random_number(100)
Die Ausgabe ist eine beliebige Zahl zwischen 0 und 100.
rand(6) #=> gives a random number between 0 and 6 inclusively
rand(1..6) #=> gives a random number between 1 and 6 inclusively
Beachten Sie, dass die Bereichsoption nur in neueren (glaube ich 1.9+) Versionen von Ruby verfügbar ist.
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.)
range.to_a.sample
ist eine schreckliche Idee, wenn die Stichprobe groß ist.
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
puts (rand() * 10).to_i
Generieren Sie eine Zahl von 0 bis 10 besser lesbar
puts rand(10)
Generieren Sie eine Zahl von 10 bis 15, einschließlich 15
puts rand(10..15)
Nicht zufällige Zufallszahlen
Generieren Sie bei jeder Programmausführung dieselbe Zahlenfolge
srand(5)
Generiere 10 Zufallszahlen
puts (0..10).map{rand(0..10)}
Vielleicht hilft es dir. Ich benutze dies in meiner App
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
Es funktioniert gut für mich
Wie wäre es mit diesem?
num = Random.new
num.rand(1..n)
Versuchen Sie die array#shuffle
Methode zur Randomisierung
array = (1..10).to_a
array.shuffle.first
.shuffle.first
mit .sample
!
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-srand