这个随机数生成器逻辑可以简化吗?

时间:2015-11-22 19:24:12

标签: f#

我正在学习F#,并想知道生成随机数的以下逻辑是否可以接受。

这可以用更易维护的方式编写吗? 这段代码安全吗?

**Itemid**      **UserID**           **Rate**        **Opinion**     
  0944947        5                         3.2           Negative
  0468569        5                                      Positive
  0411008        2                        2.1           Negative

更新

let hashset = System.Collections.Generic.HashSet<int>()
let mutable continueLooping = true

while (continueLooping) do 
   let value = System.Random().Next(0, 12)
   let success = hashset.Add(value)
   continueLooping <- hashset.Count <> 12

1 个答案:

答案 0 :(得分:4)

您可以定义辅助函数来执行Fisher-Yates shuffle。这个shuffle函数非常有用,因为它可以在任何seq<'a>上运行,因此你有很多机会重用它。

// shuffle a sequence into random order
let shuffle xs =
    // swap two elements in the supplied array
    let swap i j (array : _[]) =
        let tmp = array.[i]
        array.[i] <- array.[j]
        array.[j] <- tmp
    let rnd = System.Random()
    let xArray = Seq.toArray xs
    let n = Array.length xArray
    for i in [0..(n-2)] do
        let j = rnd.Next(i, n-1)
        swap i j xArray
    xArray |> Seq.ofArray

然后使用

将其应用于列表或其他内容
let shuffledList = [0..11] |> shuffle |> Seq.toList