open Systemtype Date = System.DateTimetype SafeDate =    | WorkingDate of Date    | InvalidDate of Exceptionlet dateAttempt (x: int, y:int, z:int) =    try         let returnDate = Date(z,y,x)        WorkingDate returnDate    with        ex -> InvalidDate exlet rnd = System.Random(4)let randomBirthYear() =    rnd.Next(1904,1954)let randomBirthMonth() =    rnd.Next(1,13)let randomBirthDay() =    rnd.Next(1,32)let generateDate() =    (randomBirthDay(), randomBirthMonth(), randomBirthYear())     |> dateAttemptlet chooseValidDate d =    match d with    | WorkingDate d -> Some d    | _ -> Nonelet sampleDobs = [for i in 1 .. 1000 -> generateDate()]let cleanDates = Seq.choose chooseValidDate sampleDobs
is there a more functionally idiomatic way of generating valid dates in f#?
random;f#;datetime;functional programming