Cách tốt nhất để trả về giá trị boolean ngẫu nhiên


103

Tôi đã sử dụng điều này một thời gian để trả về một trong hai truehoặc falsekhi xây dựng dữ liệu hạt giống giả. Chỉ tự hỏi liệu có ai có cách trả về tốt hơn, ngắn gọn hơn hoặc dài dòng hơn truekhông false.

rand(2) == 1 ? true : false

5
Theo câu trả lời của @ a'r, bạn có nhận ra rằng đó rand(2)==1đã là một giá trị boolean không?
Phrogz

Câu trả lời:


245

Đoạn mã khai báo sử dụng Array # sample :

random_boolean = [true, false].sample

Chết tiệt, tôi hoàn toàn quên mất tôi đã đăng câu hỏi này. Cảm ơn rất nhiều cho câu trả lời hữu ích!
Chuck Bergeron

4
[true, false].samplenhanh hơn rand(2) == 1. Khi tôi thực hiện mỗi thao tác 10 triệu lần , randphương pháp này là 2,179 giây. Các samplephương pháp là 1.645s.
Mirror318

[đúng, sai] .sample không phải là nhanh hơn so với rand> 0,5
Ivan Castellanos

36

Làm thế nào về việc loại bỏ toán tử bậc ba.

rand(2) == 1

2
Nó nhỏ gọn hơn, nhưng tôi thích [true, false].samplehơn vì nó rõ ràng ngay lập tức những gì nó làm. rand(2) == 1Tuy nhiên, sẽ hoạt động với ruby ​​<1,9, điều này tốt.
Automatico

2
Vì chỉ có 01, bạn cũng có thể sử dụngrand(2).zero?
Stefan

15

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

rand < 0.5

Chỉnh sửa : Câu trả lời này đã từng đọc rand > 0.5nhưng rand < 0.5đúng hơn về mặt kỹ thuật. randtrả về kết quả trong phạm vi nửa mở [0,1), do đó, việc sử dụng <dẫn đến tỷ lệ cược bằng nhau của phạm vi nửa mở [0,0,5) và [0,5,1). Việc sử dụng >sẽ dẫn đến tỷ lệ cược BẤT NGỜ của phạm vi đóng [0,0,5] và phạm vi mở (0,5,1).


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

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

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 phương thức to_boolean:

class Integer
  def to_boolean
    !self.zero?
  end
end

Trong ruby, chỉ có false và nil là falsey, tôi đặc biệt khuyên bạn không nên bắt chước loại hành vi này.
Habax

tốt hơn,rand(2).zero?
Jesse Novotny
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.