如何优雅地从集合中获取特定数量(> 1)的独特随机元素?如何从Smalltalk的集合中获取特定数量的随机元素?
回答
这是我觉得看起来或多或少不错的东西,但效率不高,因为它可以:
yourCollection asSet asOrderedCollection shuffled first: numberOfElements
考虑下面的代码片段
sample: anInteger from: aCollection using: aGenerator
| sample |
sample := Set new: anInteger.
[sample size = anInteger]
whileFalse: [ | element |
element := aCollection atRandom: aGenerator.
sample add: element].
^sample asArray
一些言论
显式生成器:它明确地使用给定的生成器,即,我称之为
aGenerator
的Random
的实例。出于数学原因,如果您正在为您的应用程序获取样品,则所有这些应该在整个程序中使用相同的生成器。此外,这将为您带来额外的好处:保存并稍后恢复seed
,您将能够重现系统的先前“随机”行为,这对测试非常有用。不检查可用性:代码不检查,有可能得到期望的采样,这将是的情况下,如果
aCollection
不具有至少anInteger
不同的元素。无类代码:该方法应去一些类。
例如:
Random >> sample: anInteger from: aCollection
| sample |
sample := Set new: anInteger.
[sample size = anInteger]
whileFalse: [ | element |
element := aCollection atRandom: self.
sample add: element].
^sample asArray
UPDATE
下面是另一种方法:
Random >> remove: anInteger from: aCollection
| sample |
sample := OrderedCollection new: anInteger.
anInteger timesRepeat: [| index element |
index := aCollection size atRandom: self.
element := aCollection removeAt: index.
sample add: element].
^sample
评论
通常情况下,当我们想要重复采样时,我们也想从随机选取的集合中删除元素。在这些情况下,经常发生的情况是该集合已知没有重复。
嗯,我喜欢“byo generator”的方法,但是如果收集和样本量很大,那么您可能会等待很长一段时间,直到发生器最终选择一个“空闲”数字。 –
@ AmosM.Carpenter好点。我使用的是更接近第二种方法。 –
对不起,你应该挑剔,但不应该使用'#removeIndex:' - 它意味着是私人的。使用公共方法'#removeAt:'相反可以回答已删除的元素,这意味着您可以摆脱额外的'element'临时变量(即,只需执行'sample add:(aCollection removeAt:index)') 。这两个“删除”方法都在OrderedCollection上,所以这不适用于其他类型的集合。 –
- 1. 以随机顺序从集合中获取所有元素
- 2. 如何从量角器的随机菜单中获取元素?
- 3. 从数组的特定元素中选择随机元素
- 4. 从集合中获取随机条目
- 5. 从集合中抽取一定数量的元素
- 6. 从数组列表中获取随机对象特定变量
- 7. 如何从C中的数组中随机选取元素?
- 8. 获取特定的随机数
- 9. 我如何从列表中获得随机数的元素
- 10. 我如何从随机迭代器中获取中间元素?
- 11. Mongo DB - 如何从集合中获取随机密钥?
- 12. 如何从集合A中获取不在集合B中的元素?即AB
- 13. Javascript/JQuery - 如何获取特定子元素的数量
- 14. 如何从GAMS的集合中获取一个元素?
- 15. 在mongo集合中获取mongo文档数组中的不同特定元素
- 16. 获取随机生成元素的ID
- 17. 如何随机从数组中获取
- 18. WPF如何绑定到集合中的特定元素
- 19. 如何从数组中获取特定元素
- 20. 从F#中的元组集合中获取元素
- 21. 如何从特定字母列表中获取随机字母?
- 22. 获取元素的最大数量的集合与JPQL
- 23. Java从Object中获取特定元素[]
- 24. Rails:获取特定数量的随机记录
- 25. 如何从数组中获得随机元素?
- 26. 夫特:获取EXC_BAD_INSTRUCTION当试图追加随机数组元素
- 27. 如何从我的本地集合中存在的数据库获取元素?
- 28. 如何获取C++中的集合中的元素?
- 29. 如何从.data中的函数中获取元素的变量
- 30. 从元素集合中获取元素作为jQuery对象
非常优雅。我可以看到提高效率(通常不会成为问题,但有些人会挂在上面......)的唯一方法就是将_indices_而不是集合(因为索引会更少) ,然后使用类似'#atAll:'的东西来从集合中挑选那些随机化的索引(如果你想要它们,你仍然需要'#asSet' _distinct_)。 –