Hoe genereer ik een willekeurig getal tussen 0
en 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 met2 + rand(6) + rand(6)
.Ten slotte, als je gewoon een willekeurige float nodig hebt, bel dan gewoon
rand
zonder argumenten.
Zoals Marc-André Lafortunevermeldt in zijn antwoord hieronder (stem het op), Ruby 1.9.2 heeft zijn eigen Random
class(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:
-
Het gebruik van
Random.new.rand(20..30)
(met behulp vanRandom.new
) zou over het algemeen geen goed idee zijn, zoals in detail wordt uitgelegd (opnieuw) door Marc-André Lafortune, in zijn antwoord(opnieuw). -
Maar als je
Random.new
niet gebruikt, dan is de klassenmethoderand
heeft alleen eenmax
waarde, geenRange
, omdat leuning(energetisch) wijst in de opmerking (en zoals gedocumenteerd in de docs voorRandom
). Alleen de instantiemethodekan eenRange
, zoals geïllustreerd door genereer een willekeurig getal met 7 cijfers.
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..30
omvat 30, ik moet een willekeurig getal tussen 0 en 11 bedenken, exclusief 11.
Antwoord 2, autoriteit 62%
Terwijl je rand(42-10) + 10
kunt gebruiken om een willekeurig getal tussen 10
en 42
te 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 backports
edelstenen.
Ruby 1.9.2 Introduceer ook de Random
Klasse, 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 Random
Klasse 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 rand
of 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.new
en gebruik het overal anders.
De gevallen waarin Random.new
is nuttig:
- Je schrijft een edelsteen en wil je niet interfereren met de reeks
rand
/Random.rand
dat 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
Random
objecten 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 SecureRandom
zijn weg heeft gevonden van ActiveSupport
naar 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 rand
methode. Het argument dat aan de methode rand
wordt doorgegeven, moet een integer
of een Range
zijn, 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_number
gebruiken.
Als een positief geheel getal wordt gegeven als n, retourneert random_number
een 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
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#shuffle
voor randomisatie
array = (1..10).to_a
array.shuffle.first
Antwoord 17
Vergeet niet eerst de RNG te seeden met srand().