2011-11-04 24 views
88

Tôi đã sử dụng tính năng này một thời gian để trả về true hoặc false khi tạo dữ liệu hạt giả. Chỉ cần tự hỏi nếu có ai có cách tốt hơn, gọn gàng hơn hoặc tiết kiệm hơn hoặc trả lại true hoặc false.Cách tốt nhất để trả về giá trị boolean ngẫu nhiên

rand(2) == 1 ? true : false 
+5

Mỗi câu trả lời bằng @ a'r, bạn có nhận ra rằng 'rand (2) == 1' đã là giá trị boolean chưa? – Phrogz

Trả lời

217

Một đoạn tường thuật sử dụng Array#sample:

random_boolean = [true, false].sample 
+0

Chết tiệt, tôi hoàn toàn quên tôi đã đăng câu hỏi này. Cảm ơn rất nhiều vì câu trả lời bằng giọng nói! –

+4

** '[true, false] .sample' là nhanh hơn ** so với' rand (2) == 1'. Khi tôi thực hiện từng hoạt động * 10 triệu lần * phương pháp 'rand' là 2.179s. Phương pháp 'mẫu' là 1.645. – Mirror318

+0

[đúng, sai]. Mẫu không nhanh hơn rand> 0.5 –

30

Làm thế nào về loại bỏ các nhà điều hành ternary.

rand(2) == 1 
+0

Tất nhiên. Sự đơn giản. Tôi thích nó. –

+2

Nó nhỏ gọn hơn, nhưng tôi thích '[true, false] .sample' tốt hơn vì nó ngay lập tức rõ ràng nó làm gì. 'rand (2) == 1' sẽ làm việc với ruby ​​<1.9 mặc dù, đó là tốt. – Automatico

+2

Vì chỉ có '0' và' 1', bạn cũng có thể sử dụng 'rand (2) .zero? ' – Stefan

4

Tôi thường sử dụng một cái gì đó như thế này:

rand(2) > 0 

Bạn cũng có thể mở rộng Integer để tạo ra một phương pháp to_boolean:

class Integer 
    def to_boolean 
    !self.zero? 
    end 
end 
10

Tôi thích sử dụng rand:

rand < 0.5

Chỉnh sửa: Câu trả lời này được sử dụng để đọc rand > 0.5 nhưng rand < 0.5 chính xác hơn về mặt kỹ thuật. rand trả lại kết quả trong số half-open range [0,1), do đó, sử dụng < dẫn đến tỷ lệ chênh lệch bằng một nửa phạm vi mở [0,0.5) và [0,5,1). Sử dụng > sẽ dẫn đến tỷ lệ UNEQUAL của phạm vi đã đóng [0,0.5] và phạm vi mở (0,55).

+3

Điều này là hoàn hảo. Phương pháp mẫu tạo ra (theo lý thuyết) xác suất ** 50% ** nhưng với điều này bạn có thể điều chỉnh xác suất đó. Nói rằng, tôi muốn có ** 70% ** cơ hội nhận được giá trị thực sẽ là 'rand> 0.3' – juliangonzalez

+2

@JGonzalezD Và để làm cho nó đơn giản và dễ đọc hơn:' rand <0.7' cho ** 70% ** – TNT

Các vấn đề liên quan