将随机索引生成到数组中的最佳方法?
Best way to generate random indices into an array?
下午好。我有一组值,我想从中抽取一个随机子集。
我的第一个想法是:
let getRandomIndices size count =
if size >= count then
let r = System.Random()
r.GetValues(0,size) |> Seq.take count |> Seq.toList
else
[0..size-1]
但是,r.GetValues(0,size) 可能会多次生成相同的值。我怎样才能得到不同的价值?我的第一个想法是重复将索引存储到一个集合中,直到该集合包含所需数量的元素?不过这个好像也太procedural/not-functional了吧?有没有更好的方法?
或者我应该从 [0..size-1] 开始并从中删除随机元素直到它包含所需的数字索引?
我并不是在寻找最有效的方法,而是最实用的方法。我正在努力更好地理解功能性思维方式。
如果您对所有索引的列表进行随机排序,您可以只取列表中的前 count
个元素。
let getRandomIndices size count =
if size >= count then
let r = System.Random()
[0..size-1] |> List.sortBy (fun _ -> r.Next()) |> List.take count
else
[0..size-1]
下午好。我有一组值,我想从中抽取一个随机子集。
我的第一个想法是:
let getRandomIndices size count =
if size >= count then
let r = System.Random()
r.GetValues(0,size) |> Seq.take count |> Seq.toList
else
[0..size-1]
但是,r.GetValues(0,size) 可能会多次生成相同的值。我怎样才能得到不同的价值?我的第一个想法是重复将索引存储到一个集合中,直到该集合包含所需数量的元素?不过这个好像也太procedural/not-functional了吧?有没有更好的方法?
或者我应该从 [0..size-1] 开始并从中删除随机元素直到它包含所需的数字索引?
我并不是在寻找最有效的方法,而是最实用的方法。我正在努力更好地理解功能性思维方式。
如果您对所有索引的列表进行随机排序,您可以只取列表中的前 count
个元素。
let getRandomIndices size count =
if size >= count then
let r = System.Random()
[0..size-1] |> List.sortBy (fun _ -> r.Next()) |> List.take count
else
[0..size-1]