Um beispielsweise eine Zufallszahl zwischen 3 und 10 zu generieren, verwende ich: rand(8) + 3
Gibt es eine schönere Möglichkeit, dies zu tun (so etwas wie rand(3, 10)
)?
y - x + 1
übrigens.
rand(3..10)
Um beispielsweise eine Zufallszahl zwischen 3 und 10 zu generieren, verwende ich: rand(8) + 3
Gibt es eine schönere Möglichkeit, dies zu tun (so etwas wie rand(3, 10)
)?
y - x + 1
übrigens.
rand(3..10)
Antworten:
UPDATE: Ruby 1.9.3 Kernel#rand
akzeptiert auch Bereiche
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
Die Konvertierung in ein Array ist möglicherweise zu teuer und nicht erforderlich.
(a..b).to_a.sample
Oder
[*a..b].sample
Standard in Ruby 1.8.7+.
Hinweis: wurde in 1.8.7 #choice genannt und in späteren Versionen umbenannt.
Das Generieren von Arrays erfordert jedoch Ressourcen, und die bereits geschriebene Lösung ist die beste, die Sie tun können.
rand(a..b)
funktioniert nicht, es teilt sich : TypeError: can't convert Range into Integer
. Es wird nicht einmal in Ruby 2.0 unterstützt
Random.new.rand(a..b)
Wo a
ist Ihr niedrigster Wert und b
ist Ihr höchster Wert.
rand()
Sie anrufen Kernel#rand
, die nur ein unterstütztes max
Argument. Wenn Sie einen Bereich übergeben möchten, müssen Sie diesen verwenden Random#rand
, dh Sie müssen ihn auf diese Weise implementieren. +1
rand(3..10)
Wenn max ein Bereich ist, gibt rand eine Zufallszahl zurück, wobei range.member? (Number) == true ist.
Beachten Sie einfach den Unterschied zwischen den Bereichsoperatoren:
3..10 # includes 10
3...10 # doesn't include 10
Und hier ist ein kurzer Maßstab für beide #sample
und #rand
:
irb(main):014:0* Benchmark.bm do |x|
irb(main):015:1* x.report('sample') { 1_000_000.times { (1..100).to_a.sample } }
irb(main):016:1> x.report('rand') { 1_000_000.times { rand(1..100) } }
irb(main):017:1> end
user system total real
sample 3.870000 0.020000 3.890000 ( 3.888147)
rand 0.150000 0.000000 0.150000 ( 0.153557)
Tun rand(a..b)
ist also das Richtige
def my_rand(x, y); rand(y - x) + x; end