如何使数组洗牌函数在后续调用中产生不同的结果

  • 本文关键字:结果 调用 数组 何使 函数 f#
  • 更新时间 :
  • 英文 :


我有以下函数,它可以按照我想要的方式进行一次调用:

let shuffle (arr : 'a array) =
    let array = Array.copy arr
    let rng = new Random()
    let n = array.Length
    for x in 1..n do
        let i = n-x
        let j = rng.Next(i+1)
        let tmp = array.[i]
        array.[i] <- array.[j]
        array.[j] <- tmp
    array

但是,对于如下所示的多个调用(x 不用于任何内容),它会为每个调用生成相同的随机播放。如何让它每次产生不同的洗牌?

[for x in 1..3 do yield shuffle [|1;2;3|]]
>
val it : int [] list = [[|1; 3; 2|]; [|1; 3; 2|]; [|1; 3; 2|]]

你想像这样将随机移动到函数之外:

let rng = new Random()
let shuffle (arr : 'a array) =
    let array = Array.copy arr
    let n = array.Length
    for x in 1..n do
        let i = n-x
        let j = rng.Next(i+1)
        let tmp = array.[i]
        array.[i] <- array.[j]
        array.[j] <- tmp
    array

原因是 RNG 默认按时间播种,在紧密循环中变化不够。 将 rng 移到函数之外意味着它会在调用中持续存在。

最新更新