F#获取随机数列表

时间:2011-05-19 17:01:46

标签: f#

我正在尝试使用随机数填充列表,并且我正在考虑获得随机数部分。我现在拥有10次随机数字,我想要的是打印10个不同的随机数

   let a = (new System.Random()).Next(1, 1000)


   let listOfSquares = [ for i in 1 .. 10->a]
    printfn "%A" listOfSquares

任何提示或建议?

5 个答案:

答案 0 :(得分:35)

您的代码只需获取一个随机数并使用十次。

此扩展方法可能很有用:

type System.Random with
    /// Generates an infinite sequence of random numbers within the given range.
    member this.GetValues(minValue, maxValue) =
        Seq.initInfinite (fun _ -> this.Next(minValue, maxValue))

然后你可以像这样使用它:

let r = System.Random()
let nums = r.GetValues(1, 1000) |> Seq.take 10

答案 1 :(得分:21)

let genRandomNumbers count =
    let rnd = System.Random()
    List.init count (fun _ -> rnd.Next ())

let l = genRandomNumbers 10
printfn "%A" l

答案 2 :(得分:3)

当我随机写一些分配器时,我喜欢每次拨打分配器使用相同的随机数发生器。你可以在F#中使用闭包(Joel和ildjarn的答案的组合)来做到这一点。

示例:

let randomWord =
    let R = System.Random()
    fun n -> System.String [|for _ in 1..n -> R.Next(26) + 97 |> char|]

通过这种方式,一个Random实例被“烘焙”到函数中,并在每次调用时重复使用。

答案 3 :(得分:0)

我认为应该小心如何初始化System.Random,因为它使用当前时间作为种子。一个实例对于整个应用程序来说足够了。将随机数注入函数具有以下优点:您可以使用固定种子并以半随机数进行复制,例如用于测试您的逻辑。

let rnd = System.Random()
let genRandomNumbers count random =
    List.init count (fun _ -> random.Next ())

let l = genRandomNumbers 10
printfn "%A" l

答案 4 :(得分:0)

有两个问题:

1)在F#中,函数应为pure,因此将不带参数的函数视为最终值。

要声明不纯函数“不带参数”,请让其接受类型为unit的一个参数

let a () = (new System.Random()).Next(1, 1000)

并将其称为传递单元参数

let list = [ for i in 1 .. 10 -> a () ]

Source

2)每次调用System.Random()时都会创建一个新的a实例。这导致获得相同的数字。要解决此问题,只需创建一次实例

let random = new System.Random()
let a () = random.Next(1, 1000)
let list = [ for i in 1 .. 10 -> a ()]

这不是特定于F#的内容,请阅读explanation for C#以获得更好的理解