Ruby'de a ve b arasında rastgele bir sayı nasıl oluşturulur?


189

Ö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)?


4
def my_rand(x, y); rand(y - x) + x; end
Theo

@Theo, y - x + 1bu arada.
Nakilon

1
Sınırlar olarak 10 ve 10 ** 24'te doğru cevabınızı deneyin: 0 çok uzun bir süre bekliyor olacak :)
Sayan Malakshinov

5
Bu çalışıyor:rand(3..10)
eikes

Yanıtlar:


324

GÜNCELLEME: Ruby 1.9.3 Kernel#randaralı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

Dizi # örnek

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.


Teşekkürler! Ben eski ve iyi bir yöntem ile kalacağım :)
Misha Moroshko

32
Bu gerçekten kötü bir fikir, özellikle a ve b'niz bilinmeyen boyutlardaysa. Deneyin (100000000000000000..100000000000000) .to_a.sample ve ne demek istediğimi
görün:)

4
@pixelearth, soruyu cevaplayan daha iyi bir fikriniz varsa, yayınlayabilirsiniz.
Nakilon

rand(a..b)çalışmıyor, bu böler: TypeError: can't convert Range into Integer. Ruby 2.0'da
fguillen

2
@fguillen 1.9.3'te benim için çalışıyor, neden senin için çalışmadığını bilmiyorum.
Michael Dorst

87
Random.new.rand(a..b) 

aEn düşük değeriniz ve ben yüksek değeriniz nerede .


4
Dikkat edilmesi gereken önemli fark, sadece rand()aradığınızda Kernel#rand, sadece bir maxargü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
grumpit

2
yukarıdakilerin 1.9.2 için geçerli olduğunu eklemelisiniz
2013'te grumpit

a ve b içerir mi?
Abhradip

12
rand(3..10)

Çekirdek # Rand

Max bir Range olduğunda rand rastgele bir sayı döndürür. Burada range.member? (Number) == true.


11

Aralık operatörleri arasındaki farkı not edin:

3..10  # includes 10
3...10 # doesn't include 10

3

Şu cevaba bakın : Ruby 1.9.2'de var, ancak önceki sürümlerde yok. Şahsen ben rand (8) + 3 iyi olduğunu düşünüyorum, ama eğer ilgileniyorsanız bağlantıda açıklanan Rastgele sınıf göz atın.




2

Ve burada her ikisi için hızlı bir ölçüttür #sampleve #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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.