F#创建随机字母和数字字符串

时间:2014-03-12 01:44:33

标签: f#

我遇到以下代码的问题。我试图创建一个随机的字母和数字串。下面的代码工作,但每个会话只创建一个随机字符串,所以如果我再次调用randomNum,它仍然保留创建的第一个随机字符串。

let randomNum(len : int) =

    let rand = new System.Random()
    let mutable str = ""
    let chars = "ABCDEFGHIJKLMNOPQRSTUVWUXYZ0123456789"
    let mutable count = 0

    for i in 1 .. len do
        count <- (rand.Next() % 36)

        str <- String.concat "" [str; chars.[count].ToString()]

    str

每次调用randomNum时,有没有人知道创建随机字符串的简单方法。

由于

4 个答案:

答案 0 :(得分:4)

您可以使用更惯用的语法来实现:

let randomStr = 
    let chars = "ABCDEFGHIJKLMNOPQRSTUVWUXYZ0123456789"
    let charsLen = chars.Length
    let random = System.Random()

    fun len -> 
        let randomChars = [|for i in 0..len -> chars.[random.Next(charsLen)]|]
        new System.String(randomChars)

我们将chars数组,它的长度和Random生成器保留在cloture中,然后返回一个函数,该函数需要所需的长度来构建字符串。

调用该函数:

let randomString10 = randomStr(10)

答案 1 :(得分:2)

这是一个不使用可变性的版本:

module String = 
   let ofChars arr = 
      arr |> Array.fold (fun acc elem -> sprintf "%s%c" acc elem) ""

let randomString len =

   let rand = new System.Random()
   let chars = Array.append [|'A'..'Z'|] [|'0'..'9'|] 
               |> String.ofChars

   Array.init len (fun _ -> chars.[rand.Next(chars.Length)])
   |> String.ofChars

(在ofChars中不使用sprintf可以进一步提高性能。)

答案 2 :(得分:1)

实际上是

new System.Random()

我刚把它移到我的代码顶部

let rand = new System.Random()

let randomNum(len : int) =

  let mutable str = ""
  let chars = "ABCDEFGHIJKLMNOPQRSTUVWUXYZ0123456789"
  let mutable count = 0

  for i in 1 .. len do
      count <- (rand.Next() % 36)

      str <- String.concat "" [str; chars.[count].ToString()]

  str

答案 3 :(得分:0)

想出来。我从另一个页面调用randomNum函数并将其存储为变量

let randomtitlevertical = Functions.randomNum(10)
let randomtitlevaluevertical = randomtitlevertical

每次激情只运行一次randomNum函数。如果我有以下代替

let randomtitlevertical = Functions.randomNum(10)

然后它将为每个项目运行一次randomNum fucntion。