我正在处理一个项目,该项目要求我编写一个从集合中选择指定数量的随机元素的函数。然后将这些元素映射到变量以供以后比较。
所以在我的场景中,我必须选择任何给定集合的5%。
let rec randomSet (a:Set<string>) =
let setLength = (a.Count / 100) * 5
let list = []
let rand = System.Random
if set.Length <> setLength then
// some code will go here
randomSet setLength eIDS
else
set
^请批评我的代码,我只用F#编码一周。
我试图递归地做,但我觉得这是错误的方式。我尝试过其他方法,但是他们使用.take函数,因此每次返回的集合都是相同的。
有什么想法吗?我不是在一组中的一个元素之后,而是在任何一组被抛出的5%之后。
这不是同一个问题:How can I select a random value from a list using F#
如果您认为是,请解释。
答案 0 :(得分:4)
有多种方法可以做到这一点。根据输入中的元素数量和要选择的项目数量,不同的策略可能更有效。
最简单的方法可能是通过随机数对输入进行排序,然后使用@Configuration
@EnableWebMvc
@ComponentScan("com.app")
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
来获取所需的元素数量:
take
这将对序列进行随机排序(对于大型序列可能会很慢),但是它会精确地获取您想要的元素数量(与Mark的解决方案不同,后者将返回大约5%的项目。)
如果你想从大型列表中选择小数字,最好随机生成索引(确保没有重复项),然后根据索引进行直接查找。
答案 1 :(得分:3)
由于Set<'a>
实现了Seq<'a>
,因此这个问题实际上是How can I select a random value from a list using F#的副本。您需要做的就是对集合进行随机播放,采用前5%的元素,把它放回一套。
只是为了它的乐趣,这是另一个解决方案。如果你需要选择5%,那么首先定义一个谓词,它只返回true
的5%:
let r = System.Random ()
let fivePercent _ = r.NextDouble () < 0.05
您现在可以使用该谓词过滤您的集:
let randomlySelectedSubset = stringSet |> Seq.filter fivePercent |> set