在F#中创建随机小数

时间:2018-08-09 22:49:04

标签: f# record

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

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'

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

2 个答案:

答案 0 :(得分:3)

该错误表示您正在传递一个预期为from sklearn.utils import shuffle # if df is the dataframe to then: n = 10 # number of rows to shuffle shuffled_df = shuffle(df[:n]).append(df[n:]) 的函数(类型为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' 部分。那是lambda的(其他)语法,但是由于您的fun i ->变量已经在范围内,因此无需围绕它创建一个函数。

答案 1 :(得分:2)

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

以下是使用XPlot F#库构建的简单直方图:

Distribution of random numbers

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