我正在尝试使用随机数填充列表,并且我正在考虑获得随机数部分。我现在拥有10次随机数字,我想要的是打印10个不同的随机数
let a = (new System.Random()).Next(1, 1000)
let listOfSquares = [ for i in 1 .. 10->a]
printfn "%A" listOfSquares
任何提示或建议?
答案 0 :(得分:35)
您的代码只需获取一个随机数并使用十次。
此扩展方法可能很有用:
type System.Random with
/// Generates an infinite sequence of random numbers within the given range.
member this.GetValues(minValue, maxValue) =
Seq.initInfinite (fun _ -> this.Next(minValue, maxValue))
然后你可以像这样使用它:
let r = System.Random()
let nums = r.GetValues(1, 1000) |> Seq.take 10
答案 1 :(得分:21)
let genRandomNumbers count =
let rnd = System.Random()
List.init count (fun _ -> rnd.Next ())
let l = genRandomNumbers 10
printfn "%A" l
答案 2 :(得分:3)
当我随机写一些分配器时,我喜欢每次拨打分配器使用相同的随机数发生器。你可以在F#中使用闭包(Joel和ildjarn的答案的组合)来做到这一点。
示例:
let randomWord =
let R = System.Random()
fun n -> System.String [|for _ in 1..n -> R.Next(26) + 97 |> char|]
通过这种方式,一个Random实例被“烘焙”到函数中,并在每次调用时重复使用。
答案 3 :(得分:0)
我认为应该小心如何初始化System.Random,因为它使用当前时间作为种子。一个实例对于整个应用程序来说足够了。将随机数注入函数具有以下优点:您可以使用固定种子并以半随机数进行复制,例如用于测试您的逻辑。
let rnd = System.Random()
let genRandomNumbers count random =
List.init count (fun _ -> random.Next ())
let l = genRandomNumbers 10
printfn "%A" l
答案 4 :(得分:0)
有两个问题:
1)在F#中,函数应为pure,因此将不带参数的函数视为最终值。
要声明不纯函数“不带参数”,请让其接受类型为unit
的一个参数
let a () = (new System.Random()).Next(1, 1000)
并将其称为传递单元参数
let list = [ for i in 1 .. 10 -> a () ]
2)每次调用System.Random()
时都会创建一个新的a
实例。这导致获得相同的数字。要解决此问题,只需创建一次实例
let random = new System.Random()
let a () = random.Next(1, 1000)
let list = [ for i in 1 .. 10 -> a ()]
这不是特定于F#的内容,请阅读explanation for C#以获得更好的理解