我有一个数组:
var names: String = [ "Peter", "Steve", "Max", "Sandra", "Roman", "Julia" ]
我想从这个数组中得到3个随机元素。我来自C#,但在swift中我不确定从哪里开始。我想我应该先 Shuffle 数组,然后从中挑选前3个元素,例如?
我试着用下面的扩展名来打乱它:
extension Array
{
mutating func shuffle()
{
for _ in 0..<10
{
sort { (_,_) in arc4random() < arc4random() }
}
}
}
但是它接着说"'()'不能在" shuffle()"的位置转换为"[Int]'"。
为了挑选一些元素,我使用:
var randomPicks = names[0..<4];
目前看来还不错。
如何 Shuffle ?或者有没有人有更好/更优雅的解决方案?
6条答案
按热度按时间d7v8vwbk1#
超码11 ·斯威夫特5.1
Playground测试
x一个一个一个一个x一个一个二个一个x一个一个三个一个
vsdwdz232#
或者有人有更好/更优雅的解决方案吗?
是的,算法上比公认的答案更好,它计数-1
arc4random_uniform
次全 Shuffle 操作,我们可以简单地在 * n *arc4random_uniform
次操作中选择 * n * 个值。实际上,我有两种方法比公认的答案做得更好:
更好的解决方案
最佳解决方案
下面的解决方案比前面的快两倍。
适用于Swift 3.0和3.1
适用于Swift 3.2和4.x
用法:
icomxhvb3#
您可以在Array上定义扩展:
如果初始数组可能有重复项,并且您希望值具有唯一性:
lnlaulya4#
Swift 4.1及更低版本
Swift 4.2及更高版本
2skhul335#
你也可以使用arc4random()从数组中只选择三个元素,如下所示:
这仅仅是一个例子,你也可以在函数中包含逻辑来为每一个函数获得不同的名称。
e5nqia276#
您可以使用
shuffle()
方法并选取混洗数组的前3项,以从原始数组中获取3个随机元素:超码14 ·斯威夫特5.7