Hoe krijg je een willekeurig getal in Ruby

Hoe genereer ik een willekeurig getal tussen 0en n?


Antwoord 1, autoriteit 100%

Gebruik rand(range)

Van Ruby Random Numbers:

Als je een willekeurig geheel getal nodig had om een worp van een zeszijdige dobbelsteen te simuleren, gebruik je: 1 + rand(6). Een worp in craps kan worden gesimuleerd met 2 + rand(6) + rand(6).

Ten slotte, als je gewoon een willekeurige float nodig hebt, bel dan gewoon randzonder argumenten.


Zoals Marc-André Lafortunevermeldt in zijn antwoord hieronder (stem het op), Ruby 1.9.2 heeft zijn eigen Randomclass(die Marc-André zelf heeft geholpen met debuggen, vandaar het 1.9.2 doelvoor die functie).

Bijvoorbeeld in dit spel waar je raad 10 cijfers, je kunt ze initialiseren met:

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

Opmerking:

Daarom zou het equivalent van Random.new.rand(20..30)20 + Random.rand(11)zijn, aangezien Random.rand(int)geeft als resultaat “een willekeurig geheel getal groter dan of gelijk aan nul en kleiner dan het argument.” 20..30omvat 30, ik moet een willekeurig getal tussen 0 en 11 bedenken, exclusief 11.


Antwoord 2, autoriteit 62%

Terwijl je rand(42-10) + 10kunt gebruiken om een willekeurig getal tussen 10en 42te krijgen (waarbij 10 is inclusief en 42 exclusief), is er een betere manier sinds Ruby 1.9.3, waar je kunt bellen:

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

Beschikbaar voor alle versies van Ruby door mijn backportsedelstenen.

Ruby 1.9.2 Introduceer ook de RandomKlasse, zodat u uw eigen Willekeurige nummergenerator-objecten kunt maken en een mooie API hebt:

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

De RandomKlasse zelf fungeert als een willekeurige generator, zodat u rechtstreeks belt:

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

Opmerkingen over Random.new

In de meeste gevallen is de eenvoudigste om randof Random.rand. Een nieuwe willekeurige generator maken Elke keer dat u een willekeurig getal wilt, is een echt slecht idee . Als u dit doet, krijgt u de willekeurige eigenschappen van het initiële zaaiige algoritme die afschuwelijk is in vergelijking met de eigenschappen van de Willekeurige generator zelf .

Als u Random.new, moet u het dus noemen zo zelden mogelijk , bijvoorbeeld één keer als MyApp::Random = Random.newen gebruik het overal anders.

De gevallen waarin Random.newis nuttig:

  • Je schrijft een edelsteen en wil je niet interfereren met de reeks rand/ Random.randdat de hoofdprogramma’s kunnen vertrouwen op
  • U wilt afzonderlijke reproduceerbare sequenties van willekeurige getallen (zeg één per draad)
  • u wilt een reproduceerbare reeks willekeurige getallen kunnen opslaan en hervatten (zo eenvoudig als Randomobjecten kunnen worden gerangschikt)

Antwoord 3, autoriteit 5%

Als u niet alleen naar een getal zoekt, maar ook naar hex of uuid, is het vermeldenswaard dat de module SecureRandomzijn weg heeft gevonden van ActiveSupportnaar de ruby core in 1.9 .2+. Dus zonder de noodzaak van een volledig opgeblazen raamwerk:

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"

Het is hier gedocumenteerd: Ruby 1.9.3 – Module: SecureRandom (lib/securerandom.rb )


Antwoord 4, autoriteit 4%

Je kunt een willekeurig getal genereren met de randmethode. Het argument dat aan de methode randwordt doorgegeven, moet een integerof een Rangezijn, en retourneert een overeenkomstig willekeurig getal binnen het bereik:

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

Antwoord 5, autoriteit 2%

Nou, ik heb het door. Blijkbaar is er een ingebouwde (?) functie genaamd rand:

rand(n + 1)

Als iemand antwoordt met een meer gedetailleerd antwoord, markeer ik dat als het juiste antwoord.


Antwoord 6, autoriteit 2%

Hoe zit het hiermee?

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

Antwoord 7

Het eenvoudigste antwoord op de vraag:

rand(0..n)

Antwoord 8

Je kunt gewoon random_numbergebruiken.

Als een positief geheel getal wordt gegeven als n, retourneert random_numbereen geheel getal: 0 <= random_number< z.

Gebruik het als volgt:

any_number = SecureRandom.random_number(100) 

De uitvoer is een willekeurig getal tussen 0 en 100.


Antwoord 9

rand(6)    #=> gives a random number between 0 and 6 inclusively 
rand(1..6) #=> gives a random number between 1 and 6 inclusively

Merk op dat de bereikoptie alleen beschikbaar is in nieuwere (1,9+ geloof ik) versies van ruby.


Antwoord 10

bereik = 10..50

rand(bereik)

of

bereik.naar_a.voorbeeld

of

range.to_a.shuffle(hiermee wordt de hele array door elkaar geschud en je kunt een willekeurig nummer kiezen als eerste of laatste of een willekeurig getal uit deze array om een willekeurig getal te kiezen)


Antwoord 11

je kunt rand(bereik) doen

x = rand(1..5)

Antwoord 12

Deze link zal hierbij nuttig zijn;

http://ruby-doc.org/core-1.9.3/ Willekeurig.html

En hieronder wat meer duidelijkheid over de willekeurige getallen in robijn;

Genereer een geheel getal van 0 tot 10

puts (rand() * 10).to_i

Genereer een getal van 0 tot 10
Op een meer leesbare manier

puts rand(10)

Genereer een getal van 10 tot 15
Inclusief 15

puts rand(10..15)

Niet-willekeurige willekeurige getallen

Genereer elke keer dezelfde reeks getallen
het programma wordt uitgevoerd

srand(5)

Genereer 10 willekeurige getallen

puts (0..10).map{rand(0..10)}

Antwoord 13

Een gemakkelijke manier om een willekeurig getal in robijn te krijgen is,

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

Antwoord 14

Misschien helpt het je. Ik gebruik dit in mijn 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

Het werkt prima voor mij


Antwoord 15

Wat dacht je van deze?

num = Random.new
num.rand(1..n)

Antwoord 16

Probeer de methode array#shufflevoor randomisatie

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

Antwoord 17

Vergeet niet eerst de RNG te seeden met srand().

Other episodes