在 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
我正在尝试创建一个随机小数,如下所示:
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