【发布时间】:2015-01-31 06:50:01
【问题描述】:
我有一个类似的数组:
var names: String = [ "Peter", "Steve", "Max", "Sandra", "Roman", "Julia" ]
我想从该数组中获取 3 个随机元素。我来自 C#,但很快我不确定从哪里开始。例如,我认为我应该先对数组进行洗牌,然后从中挑选前 3 个项目?
我尝试使用以下扩展名对其进行洗牌:
extension Array
{
mutating func shuffle()
{
for _ in 0..<10
{
sort { (_,_) in arc4random() < arc4random() }
}
}
}
但它会在“shuffle()”的位置显示“'()' is not convertible to '[Int]'”。
为了挑选我使用的一些元素:
var randomPicks = names[0..<4];
目前看起来不错。
如何洗牌?或者有人对此有更好/更优雅的解决方案吗?
【问题讨论】:
-
查看stackoverflow.com/questions/24026510/… 以获得更好的随机播放方法。
-
谢谢,我现在使用公认答案的变异扩展方法进行改组。
-
是的,有更好/更优雅的解决方案:完全洗牌不是最佳选择,就好像你需要 10 个随机元素中的 4 个一样,一个一个选择只需要 4 个
arc4random_uniform,但完全洗牌需要 9arc4random_uniform。 -
使用
sort像那样洗牌是行不通的。排序故意尽可能少地进行比较,当然这还不足以实现像样的洗牌。
标签: arrays swift random shuffle