web-dev-qa-db-de.com

Wie bekomme ich eine Zufallszahl in Ruby

Wie erstelle ich eine Zufallszahl zwischen 0 und n?

767

Verwende Rand(range)

Von 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 2 + Rand(6) + Rand(6) simuliert werden.

Wenn Sie nur einen zufälligen Gleitkommawert benötigen, rufen Sie Rand ohne Argumente auf.


Wie Marc-André Lafortune in seiner Antwort unten erwähnt hatRuby 1.9.2 ein eigenes Random Klasse (die Marc-André selbst beim Debuggen half , daher das 1.9.2-Ziel für diese Funktion).

Zum Beispiel können Sie in diesem Spiel , in dem Sie 10 Zahlen erraten müssen, diese wie folgt initialisieren:

10.times.map{ 20 + Random.Rand(11) } 
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]

Hinweis:

Dies ist der Grund, warum das Äquivalent von Random.new.Rand(20..30)20 + Random.Rand(11) ist, da Random.Rand(int) "eine zufällige Ganzzahl größer oder gleich Null und kleiner als das Argument " zurückgibt. 20..30 Umfasst 30, muss ich mir eine Zufallszahl zwischen 0 und 11 ausdenken, mit Ausnahme von 11.

937
VonC

Während Sie Rand(42-10) + 10 verwenden können, um eine Zufallszahl zwischen 10 und 42 zu erhalten (wobei 10 inklusiv und 42 exklusiv ist), gibt es seit Ruby 1.9 einen besseren Weg. 3, wo Sie anrufen können:

Rand(10...42) # => 13

Verfügbar für alle Versionen von Ruby, indem mein backports gem benötigt wird.

Ruby 1.9.2 hat auch die Klasse Random eingeführt, damit Sie Ihre eigenen Zufallszahlengeneratorobjekte erstellen können und eine Nice-API haben:

r = Random.new
r.Rand(10...42) # => 22
r.bytes(3) # => "rnd"

Die Klasse Random selbst fungiert als Zufallsgenerator, sodass Sie direkt Folgendes aufrufen:

Random.Rand(10...42) # => same as Rand(10...42)

Hinweise zu Random.new

In den meisten Fällen ist es am einfachsten, Rand oder Random.Rand zu verwenden. Es ist eine wirklich schlechte Idee , jedes Mal einen neuen Zufallsgenerator zu erstellen, wenn Sie eine Zufallszahl wollen. 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 Random.new verwenden, sollten Sie es daher so selten wie möglich aufrufen , zum Beispiel einmal als MyApp::Random = Random.new und überall anders verwenden.

Die Fälle, in denen Random.new hilfreich ist, sind die folgenden:

  • sie schreiben ein Juwel und möchten nicht in die Sequenz von Rand/Random.Rand eingreifen, auf die sich die Hauptprogramme verlassen könnten
  • sie möchten separate, reproduzierbare Folgen von Zufallszahlen (z. B. eine pro Thread)
  • sie möchten in der Lage sein, eine reproduzierbare Folge von Zufallszahlen zu speichern und fortzusetzen (so einfach, wie Random-Objekte gemarshallt werden können)
586

Wenn Sie nicht nur nach einer Zahl, sondern auch nach Hex oder UUID suchen, sollten Sie erwähnen, dass das SecureRandom -Modul in 1.9.2+ seinen Weg vom ActiveSupport zum Ruby -Kern 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)

46

Sie können eine Zufallszahl mit der Methode Rand generieren. Das an die Rand -Methode übergebene Argument sollte ein integer oder ein range sein 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
36
user1389938

Nun, ich habe es herausgefunden. Anscheinend gibt es eine eingebaute (?) Funktion namens Rand:

Rand(n + 1)

Wenn jemand mit einer ausführlicheren Antwort antwortet, werde ich dies als die richtige Antwort markieren.

21

Was ist damit?

n = 3
(0..n).to_a.sample
18
Rimian

Einfachste Antwort auf die Frage:

Rand(0..n)
12
sqrcompass

bereich = 10..50

Rand (Bereich)

oder

range.to_a.sample

oder

range.to_a.shuffle (Dies wird das gesamte Array mischen und Sie können eine Zufallszahl nach dem ersten oder letzten oder einem beliebigen Wert aus diesem Array auswählen, um einen zufälligen Wert auszuwählen.)

6
sumit
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 Ruby-Versionen (1.9 oder höher) verfügbar ist.

6
Josh

Sie können einfach random_number verwenden.

Wenn eine positive ganze Zahl als n angegeben wird, gibt random_number eine ganze Zahl zurück: 0 <= random_number <n.

Benutze es so:

any_number = SecureRandom.random_number(100) 

Die Ausgabe ist eine beliebige Zahl zwischen 0 und 100.

6
techdreams

Dieser Link wird in dieser Hinsicht hilfreich sein.

http://Ruby-doc.org/core-1.9.3/Random.html

Und einige mehr Klarheit über die Zufallszahlen in Ruby;

Generiere eine ganze Zahl von 0 bis 10

puts (Rand() * 10).to_i

Generieren Sie eine Zahl von 0 bis 10 auf eine besser lesbare Weise

puts Rand(10)

Generiere eine Zahl von 10 bis 15, einschließlich 15

puts Rand(10..15)

Nicht zufällige Zufallszahlen

Generieren Sie jedes Mal, wenn das Programm ausgeführt wird, dieselbe Zahlenfolge

srand(5)

Generiere 10 Zufallszahlen

puts (0..10).map{Rand(0..10)}
4
Sam

sie können Rand (Bereich) tun

x = Rand(1..5)
4
Snifferdog

Der einfache Weg, eine Zufallszahl in Ruby zu erhalten, ist,

def random    
  (1..10).to_a.sample.to_s
end
3
ysk

In der Sprache Ruby haben wir die Methode Rand(). Mit dieser Methode können Sie eine Zufallszahl erzeugen. Die Methode Rand() hat nur ein ganzzahliges Argument oder einen ganzzahligen Bereich. Der Rückgabetyp dieser Methode ist eine zufällige Ganzzahl.

 Rand()          # This Will generates a random number between 0.0 to 1.0
 Rand(10)        # This Will generates a number between 0 to 10
 Rand(1 .. 9)    # This Will generates a number between 1 to 10
 Rand(1 ... 10)  # This Will generates a number between 2 to 9

HINWEIS: Die von Rand() erzeugten Zahlen reichen für einfache Anwendungen aus.

Wenn Sie es jedoch aus Sicherheitsgründen benötigen, z. B. zum Generieren eines Einmalkennworts oder zum Erstellen von Token zum Zurücksetzen von Kennwörtern, müssen Sie einen Teil der Ruby -Standardbibliothek verwenden, der SecureRandom ist.

require 'securerandom'

SecureRandom.random_number
=> 0.232

SecureRandom.random_number(100)
=> 72

SecureRandom.hex
=> "87694e9e5231aba6ssdfs3de39c58cdfbe307"
3
Amol Mohite

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

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

Es funktioniert gut für mich

2
amarradi

Wie wäre es mit diesem?

num = Random.new
num.Rand(1..n)
2
Juan Dela Cruz

Versuchen Sie die Methode array#shuffle für die Randomisierung

array = (1..10).to_a
array.shuffle.first
2
LuckyElf

Vergessen Sie nicht, zuerst den RNG mit srand () zu setzen.

0
Liebach

benutze einfach so die 'Rand'-Funktion

Rand(10)