Это должно сработать:
let randInst<'t>() =
let cases = Reflection.FSharpType.GetUnionCases(typeof<'t>)
let index = System.Random().Next(cases.Length)
let case = cases.[index]
Reflection.FSharpValue.MakeUnion(case, [||]) :?> 't
В этом коде предполагается, что все случаи объединения являются нулевыми и что тип, который вы используете, на самом деле является типом объединения, но было бы легко явно проверить эти предположения и выдать значимые исключения, если это необходимо.