Vielen Dank! Ich denke, ich werde bei der alten und der guten Methode bleiben :)
Misha Moroshko
32
Dies ist eine wirklich schlechte Idee, besonders wenn a und b unbekannte Größen haben. Versuchen Sie (100000000000000000..100000000000000) .to_a.sample und sehen Sie, was ich meine
:)
4
@pixelearth, wenn Sie eine bessere Idee haben, die der Frage entspricht, können Sie gerne posten.
Nakilon
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
fguillen
2
@fguillen Es funktioniert für mich in 1.9.3, ich weiß nicht, warum es für Sie nicht funktioniert.
Michael Dorst
87
Random.new.rand(a..b)
Wo aist Ihr niedrigster Wert und bist Ihr höchster Wert.
Der wesentliche Unterschied zu beachten ist , dass , wenn Sie gerade nennen rand()Sie anrufen Kernel#rand, die nur ein unterstütztes maxArgument. Wenn Sie einen Bereich übergeben möchten, müssen Sie diesen verwenden Random#rand, dh Sie müssen ihn auf diese Weise implementieren. +1
Grumpit
2
sollte hinzufügen, dass das oben Gesagte für 1.9.2 gilt
Siehe diese Antwort: Es gibt in Ruby 1.9.2, aber nicht in früheren Versionen. Persönlich denke ich, dass Rand (8) + 3 in Ordnung ist, aber wenn Sie interessiert sind, schauen Sie sich die im Link beschriebene Zufallsklasse an.
Und hier ist ein kurzer Maßstab für beide #sampleund #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.8700000.0200003.890000(3.888147)
rand 0.1500000.0000000.150000(0.153557)
def my_rand(x, y); rand(y - x) + x; end
y - x + 1
übrigens.rand(3..10)
Antworten:
UPDATE: Ruby 1.9.3
Kernel#rand
akzeptiert auch Bereichehttp://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.
Oder
Array # Beispiel
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.
quelle
rand(a..b)
funktioniert nicht, es teilt sich :TypeError: can't convert Range into Integer
. Es wird nicht einmal in Ruby 2.0 unterstütztWo
a
ist Ihr niedrigster Wert undb
ist Ihr höchster Wert.quelle
rand()
Sie anrufenKernel#rand
, die nur ein unterstütztesmax
Argument. Wenn Sie einen Bereich übergeben möchten, müssen Sie diesen verwendenRandom#rand
, dh Sie müssen ihn auf diese Weise implementieren. +1Kernel # rand
quelle
Beachten Sie einfach den Unterschied zwischen den Bereichsoperatoren:
quelle
Siehe diese Antwort: Es gibt in Ruby 1.9.2, aber nicht in früheren Versionen. Persönlich denke ich, dass Rand (8) + 3 in Ordnung ist, aber wenn Sie interessiert sind, schauen Sie sich die im Link beschriebene Zufallsklasse an.
quelle
Für 10 und 10 ** 24
quelle
rand(10..10**24)
quelle
Und hier ist ein kurzer Maßstab für beide
#sample
und#rand
:Tun
rand(a..b)
ist also das Richtigequelle