在 F# 中创建一个随机小数

Creating a random fractional number in F#

我正在尝试创建一个随机小数,如下所示:

type Fraction=
  {
  num: int
  den: int
  }

let makeRandomFraction i =
  let n= fun i -> System.Random(i).Next(-50, 51)
  let d= fun i -> System.Random(i*3).Next(-50, 51)
  {num=n; den=d}

但我收到一个错误:

error FS0001: This expression was expected to have type
    'int'
but here has type
    'int -> int'

能否请您解释错误以及执行所需操作的正确方法。

错误是说您正在传递一个函数(int -> int 类型),其中需要 int。您可以在以下内容中更清楚地看到这一点:

let add a b = a + b
let inc x = x + 1

inc add
//  ^^^
// This expression was expected to have type 'int' but has type 'int -> int -> int'

这里的解决方法就是把fun i ->部分去掉。这是 lambda 的(其他)语法,但由于您的 i 变量已经在范围内,因此无需围绕它创建函数。

出于好奇,您对函数生成的分数范围和分布有什么要求吗?当前编写代码的方式 - 通过组合 -50 .. 50 范围内的两个随机数,您将获得大多数数字接近于零的分布。

这是一个使用 XPlot F# 库构建的简单直方图:

open XPlot.GoogleCharts

type Fraction=
  { num: int
    den: int }

let makeRandomFraction i =
  let n = System.Random(i).Next(-50, 51)
  let d = System.Random(i*3).Next(-50, 51)
  {num=n; den=d}

[ for i in 0 .. 100000 -> let f = makeRandomFraction i in float f.num / float f.den ]
|> Seq.filter (System.Double.IsInfinity >> not)
|> Seq.countBy (fun f -> int f)
|> Chart.Column