Loops 随机循环

Loops 随机循环,loops,f#,Loops,F#,我正在查看MicrosoftF指南中的…in循环,想知道for in循环是如何随机进行的 例如: let list1 = [ 1; 5; 100; 450; 788 ] for i in list1 do printfn "%d" i output: 1 5 100 450 788 如果我想使用for in-loop以随机顺序打印元素,我能做什么?这里有一个使用随机函数的简单方法 let random= new Random() let randomizeList lst =

我正在查看MicrosoftF指南中的…in循环,想知道for in循环是如何随机进行的

例如:

let list1 = [ 1; 5; 100; 450; 788 ]
for i in list1 do
  printfn "%d" i

output:
1
5
100
450
788

如果我想使用for in-loop以随机顺序打印元素,我能做什么?

这里有一个使用随机函数的简单方法

let random= new Random()

let randomizeList lst = 
    lst 
    |> List.sortBy (fun (_) -> random.Next(lst.Length * 1000))

let list1 = [ 1; 5; 100; 450; 788 ] 
                |> randomizeList
for i in list1 do
  printfn "%d" i
请参阅随机数生成器中关于随机性的注释-有更好的算法来生成更纯的随机分布,-

选择的数字不是完全随机的,因为使用了数学算法来选择它们,但它们在实际应用中具有足够的随机性


我们已经确定,从本质上讲,对给定的集合进行随机化的方法是唯一的。容易出错;这里有一个C语言的讨论

我们在实现中留下的自由:在执行随机交换时,我们可以向上或向下计数,我们可以决定对数组进行适当的变异,或者创建输入数据的副本

// Mutate in place, count downwards
let shuffle arr =
    let rnd = System.Random()
    for i in Array.length arr - 1 .. -1 .. 1 do
        let tmp, j = arr.[i], rnd.Next(0, i)
        arr.[i] <- arr.[j]; arr.[j] <- tmp

let a = [|1; 5; 100; 450; 788|]
shuffle a

// Create a copy, count upwards
let copyShuffle source =
    let arr = Seq.toArray source
    let rnd, len = System.Random(), arr.Length
    for i in 0 .. len - 2 do
        let tmp, j = arr.[i], rnd.Next(i, len)
        arr.[i] <- arr.[j]; arr.[j] <- tmp
    arr

copyShuffle [1; 5; 100; 450; 788]
|> Array.iter (printfn "%i")

在此处随机排列arraySearch顺序,依此类推。我认为Fisher-Yates shuffle看起来真的很好。这个答案是非常有缺陷的,正如这里解释的,请参阅排序部分:我从来没有说过这是最好的方法,但它是有效的。如果使用建议的Fisher-Yates算法,则需要一个可变列表,而OPNo发布的代码中没有这种情况,可以通过多种方式实现它,包括使用列表。OP询问如何随机化列表,但这并没有以统一的方式随机化列表。这被描述为一种极其糟糕的方法。不管是OP还是您喜欢这个解决方案。@Bent Tranberg我正在研究如何对列表进行随机化,特别是我正在尝试对x,y坐标列表进行随机化,似乎最建议的方法是在调用for in循环之前使用list.sortBy函数。更具体地说,我需要在每个坐标上执行某些操作,但坐标需要随机选取,而不是按特定顺序。所以这个想法是:如果我有一个[xa,ya;xb,yb;xc,yc;xd,yd]的列表,我不想按a,b,c,d的顺序执行动作,而是按随机顺序执行。“你认为你能帮我吗?”Bent Tranberg我看了这些,我想我接近一个解决方案了。谢谢我的投票,但让我们指出,在生产代码中,在每次调用中创建System.Random可能会有问题。和2系统。随机性可能不够好,例如,如果涉及金钱,则用于洗牌。这是一个很好的解决方案,尽管对于F来说很难习惯。正如Brent Random所指出的,随机性应该是函数的一个参数。