Tôi muốn tạo ra một máy phát điện trong ScalaCheck mà tạo ra số giữa nói 1 đến 100, nhưng với một sự thiên vị chuông giống như đối với số gần gũi hơn với 1.ScalaCheck: chọn một số nguyên với phân bố xác suất tùy chỉnh
Gen.choose()
phân phối số một cách ngẫu nhiên giữa giá trị min và max:
scala> (1 to 10).flatMap(_ => Gen.choose(1,100).sample).toList.sorted
res14: List[Int] = List(7, 21, 30, 46, 52, 64, 66, 68, 86, 86)
và Gen.chooseNum()
có xu hướng gia tăng đối với các giới hạn trên và dưới:
scala> (1 to 10).flatMap(_ => Gen.chooseNum(1,100).sample).toList.sorted
res15: List[Int] = List(1, 1, 1, 61, 85, 86, 91, 92, 100, 100)
Tôi muốn một chức năng choose()
rằng sẽ cung cấp cho tôi một kết quả mà trông giống như sau:
scala> (1 to 10).flatMap(_ => choose(1,100).sample).toList.sorted
res15: List[Int] = List(1, 1, 1, 2, 5, 11, 18, 35, 49, 100)
Tôi thấy rằng choose()
và chooseNum()
có một tiềm ẩn Choose đặc điểm như một cuộc tranh cãi. Tôi có nên sử dụng nó không?
Nếu theo Bell giống như bạn ngụ ý Gaussian thì không thể vì phân phối Gaussian (bình thường) là đối xứng xung quanh giá trị trung bình (bạn muốn 1) để bạn nhận được nhiều giá trị âm có thể nhận được giá trị tuyệt đối và sau đó nó có thể là những gì bạn muốn), dù sao có hai cách để đạt được thứ là, cách thứ nhất là chuyển đổi phân bố đồng nhất (được sử dụng bởi 'Gen.choose' theo mặc định) thành phân phối chuẩn, cách thứ hai là sử dụng các trình tạo ngẫu nhiên hỗ trợ phân phối Gaussian, dù sao câu trả lời được đưa ra bởi @LaloInDublin yêu cầu của bạn) –
Không phải là câu trả lời nhưng đáng xem xét tại sao bạn thực sự muốn hoặc cần phải làm điều này. Sự thiên vị trong 'selectNum', v.v. được thiết kế để nắm bắt các trường hợp góc - ít rõ ràng lý do tại sao bạn muốn loại phân phối mà bạn mô tả. –