Örneğin, 3 ile 10 arasında rastgele bir sayı oluşturmak için şunu kullanıyorum: rand(8) + 3
Bunu yapmanın daha güzel bir yolu var mı rand(3, 10)
?
y - x + 1
bu arada.
rand(3..10)
Örneğin, 3 ile 10 arasında rastgele bir sayı oluşturmak için şunu kullanıyorum: rand(8) + 3
Bunu yapmanın daha güzel bir yolu var mı rand(3, 10)
?
y - x + 1
bu arada.
rand(3..10)
Yanıtlar:
GÜNCELLEME: Ruby 1.9.3 Kernel#rand
aralıkları da kabul eder
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
Diziye dönüştürmek çok pahalı olabilir ve gereksizdir.
(a..b).to_a.sample
Veya
[*a..b].sample
Ruby 1.8.7+ sürümünde standarttır.
Not: 1.8.7'de #choice olarak adlandırılmış ve sonraki sürümlerde yeniden adlandırılmıştır.
Ama yine de, dizi oluşturmak kaynaklara ihtiyaç duyuyor ve zaten yazdığınız çözüm yapabileceğiniz en iyisi.
Random.new.rand(a..b)
a
En düşük değeriniz ve b
en yüksek değeriniz nerede .
rand()
aradığınızda Kernel#rand
, sadece bir max
argümanı destekleyen arama yaptığınızdır . Bir aralığı geçmek istiyorsanız, kullanmanız gerekir Random#rand
, yani bu şekilde uygulamanız gerekir. +1
rand(3..10)
Max bir Range olduğunda rand rastgele bir sayı döndürür. Burada range.member? (Number) == true.
Aralık operatörleri arasındaki farkı not edin:
3..10 # includes 10
3...10 # doesn't include 10
Ve burada her ikisi için hızlı bir ölçüttür #sample
ve #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)
Yani yapmak rand(a..b)
doğru şey
def my_rand(x, y); rand(y - x) + x; end