如何在Swift中随机化或混洗数组中的元素?例如,如果我的阵列由52张扑克牌,我想洗牌的阵列,以洗牌.
当我伸出Collection
的类型count
是IndexDistance
.
当我扩展Array
类型时count
,类型Int
为什么会有这样的区别?这是最近的变化还是总是像这样?
我已经阅读了这个答案,但不能捡到太多.
我认为唯一相关但却不理解的是:
另一个优点是,[IndexDistance]也可以正确处理数组切片(其中第一个元素的索引不一定为零)
不确定那是什么意思.
我问的原因是为什么代码会在Collection上抛出错误但在Array上没有这样做...尽管两者count
最终都是Int
.
extension Collection where Element: Comparable{
func whatever(){
for index in 0...count{ // binary operator '...' cannot be applied to operands of type 'Int' and 'Self.IndexDistance'
}
}
}
extension Array where Element: Comparable{
func whatever(){
for index in 0...count{ // NO ERROR
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
根据Martin和其他人的评论,我添加了一个额外的问题.可能这是我问题的根本原因......
这是否意味着中Collection
类型IndexDistance
没有定义Int
.基本上一般来说,在"协议"级别,关联 …
我有一个像这样的数组:
var names: String = [ "Peter", "Steve", "Max", "Sandra", "Roman", "Julia" ]
Run Code Online (Sandbox Code Playgroud)
我想从该数组中获取3个随机元素.我是从C#来的,但是我很快就不知道从哪里开始.我想我应该首先将阵列洗牌,然后从中挑选前3个项目?
我尝试使用以下扩展名对其进行随机播放:
extension Array
{
mutating func shuffle()
{
for _ in 0..<10
{
sort { (_,_) in arc4random() < arc4random() }
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它然后说"'()'在"shuffle()"的位置不能转换为'[Int]'".
为了挑选我使用的一些元素:
var randomPicks = names[0..<4];
Run Code Online (Sandbox Code Playgroud)
到目前为止看起来不错.
怎么洗牌?或者有没有人有更好/更优雅的解决方案?
我一直在选择和探测Swift标准库sort()
函数的Array
类型.令我惊讶的是,我注意到它在已经排序的数据上表现不佳.
对一个数组进行排序的排序Int
似乎比已经排序的同一个数组的排序速度快5倍.对一个混洗对象的数组进行排序比按排序顺序排序相同的数据快4倍(排序对象数组与Int
数组使用不同的算法我确定所以我将它们排序以消除偏差).
这些是结果:
Shuffled Int array sort time: 1.3961209654808
Shuffled ColorObject array sort time: 3.14633798599243
NOnshuffled Int array sort time: 7.34714204072952
NOnshuffled ColorObject array sort time: 10.9310839772224
Run Code Online (Sandbox Code Playgroud)
以下是我的代码参考:
class ElapsedTimer {
let startTime: CFAbsoluteTime
var endTime: CFAbsoluteTime?
init() {
startTime = CFAbsoluteTimeGetCurrent()
}
func stop() -> CFAbsoluteTime {
endTime = CFAbsoluteTimeGetCurrent()
return duration!
}
var duration: CFAbsoluteTime? {
if let endTime = endTime {
return endTime - startTime
} else {
return …
Run Code Online (Sandbox Code Playgroud) 我知道iOS 9中有一种新的随机播放方法, 但是我想知道是否仍然可以用相同的方式随机播放两个数组?
例如
[1,2,3,4] and [a,b,c,d]
shuffle
[3,4,1,2] and [c,d,a,b]
Run Code Online (Sandbox Code Playgroud)