簡體   English   中英

F# 獲取隨機數列表

[英]F# getting a list of random numbers

我試圖用隨機數填充一個列表,但很難獲得隨機數部分。 我現在打印出一個隨機數 10 次,我想要的是打印出 10 個不同的隨機數

   let a = (new System.Random()).Next(1, 1000)


   let listOfSquares = [ for i in 1 .. 10->a]
    printfn "%A" listOfSquares

任何提示或建議?

您的代碼只是獲取一個隨機數並使用它十次。

此擴展方法可能有用:

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
let genRandomNumbers count =
    let rnd = System.Random()
    List.init count (fun _ -> rnd.Next ())

let l = genRandomNumbers 10
printfn "%A" l

當我編寫隨機分配器時,我喜歡對分配器的每次調用使用相同的隨機數生成器。 您可以在 F# 中使用閉包(Joel 和 ildjarn 的答案的組合)來做到這一點。

例子:

let randomWord =
    let R = System.Random()
    fun n -> System.String [|for _ in 1..n -> R.Next(26) + 97 |> char|]

通過這種方式,Random 的單個實例被“烘焙”到函數中,並在每次調用時重用它。

有兩個問題:

1) 在 F# 中,函數應該是函數,因此沒有參數的函數被視為最終值。

要聲明“不帶參數”的不純函數,請讓它接受一個類型為unit參數

let a () = (new System.Random()).Next(1, 1000)

並調用它傳遞單元參數

let list = [ for i in 1 .. 10 -> a () ]

來源

2) 每次調用a時都會創建新的System.Random()實例。 這導致獲得相同的數字。 要解決此問題,只需創建一次實例

let random = new System.Random()
let a () = random.Next(1, 1000)
let list = [ for i in 1 .. 10 -> a ()]

這不是特定於 F#,閱讀C# 的解釋以更好地理解

你也可以避免像 Pavel 所說的那樣聲明一個不純的函數,然后運行:

let rnd = Random()
let rndList = [for i in 0..100 do rnd.Next(1000)]

我認為應該小心如何初始化 System.Random 因為它使用當前時間作為種子。 一個實例應該足以滿足整個應用程序的需求。 將隨機注入函數的優點是您可以使用固定種子並以半隨機性進行復制,例如用於測試您的邏輯。

let rnd = System.Random()
let genRandomNumbers random count =
    List.init count (fun _ -> random.Next ())
let getRandomNumbersSeeded = getRandomNumbers rnd

let l = getRandomNumbersSeeded 10
printfn "%A" l

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM