我遇到以下代码的问题。我试图创建一个随机的字母和数字串。下面的代码工作,但每个会话只创建一个随机字符串,所以如果我再次调用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时,有没有人知道创建随机字符串的简单方法。
由于
答案 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。