如何将下面的函数转换为swift 3
?当前出现Binary operator '..<' cannot be applied to operands of type 'Int' and 'Self.IndexDistance'
错误。
extension MutableCollection where Index == Int {
/// Shuffle the elements of `self` in-place.
mutating func shuffleInPlace() {
// empty and single-element collections don't shuffle
if count < 2 { return }
for i in 0..<count - 1 { //error takes place here
let j = Int(arc4random_uniform(UInt32(count - i))) + i
guard i != j else { continue }
swap(&self[i], &self[j])
}
}
}
count
返回,IndexDistance
它是描述两个集合索引之间距离的类型。IndexDistance
必须为SignedInteger
,但不必为Int
,可以与有所不同Index
。因此,不可能创建范围0..<count - 1
。
一个解决方案是使用startIndex
和endIndex
代替0
and count
:
extension MutableCollection where Index == Int {
/// Shuffle the elements of `self` in-place.
mutating func shuffle() {
// empty and single-element collections don't shuffle
if count < 2 { return }
for i in startIndex ..< endIndex - 1 {
let j = Int(arc4random_uniform(UInt32(endIndex - i))) + i
if i != j {
swap(&self[i], &self[j])
}
}
}
}
另一个优点是,它也可以与数组 切片 正确配合使用 (第一个元素的索引不一定为零)。
请注意,根据新的“ Swift API设计指南”,它 shuffle()
是变异随机播放方法和shuffled()
返回数组的非变异对应方法的“适当”名称:
extension Collection {
/// Return a copy of `self` with its elements shuffled
func shuffled() -> [Iterator.Element] {
var list = Array(self)
list.shuffle()
return list
}
}
_更新:_我已经在Swift中添加了一个(甚至更通用的)Swift 3版本
对于 Swift 4(Xcode 9) ,必须用对集合方法的swap()
调用来代替对函数的调用swapAt()
。同样,Index
不再需要对类型的限制:
extension MutableCollection {
/// Shuffle the elements of `self` in-place.
mutating func shuffle() {
for i in indices.dropLast() {
let diff = distance(from: i, to: endIndex)
let j = index(i, offsetBy: numericCast(arc4random_uniform(numericCast(diff))))
swapAt(i, j)
}
}
}
有关的更多信息,请参见SE-0173MutableCollection.swapAt(_:_:)
swapAt
。
从 Swift 4.2 (Xcode 10,当前处于beta版)开始,具有 SE-0202 Random
Unification的实现
,
shuffle()
并且shuffled()
是Swift标准库的一部分。
随机排列指定数组的值,返回一个新的数组。 使用 Fisher-Yates 算法 对数组元素进行重新排序。 const shuffle = ([...arr]) => { let m = arr.length; while (m) { const i = Math.floor(Math.random() * m--); [arr[m], arr[i]] = [arr[i],
问题内容: 我一直在谷歌上寻找答案,但似乎找不到一个万无一失的东西,而且真的负担不起将其弄乱(进入生产站点)。 我所拥有的是具有20多个过滤器的高级搜索,它返回一个包含ID和Distance的数组。我需要做的是将这些结果混洗以每次随机显示。目前我得到的数组是: 我需要做的是每次都对它们进行随机化或排序,但要保持id和距离对,即: 谢谢 :) 问题答案: 在第一个用户后下的文件: 在保留键,值对的同
问题内容: 如何有效地洗净大型(1m至5m记录)表的内容?已知该列具有唯一值,但是您可以假定为此删除了所有约束。我之所以头痛,主要是因为我正在更新选择的同一列。我的目标是使用PL / SQL做到这一点,以便我可以以编程方式采取其他措施,例如记录或更新其他表。 我最近的尝试是创建一个使用的游标,并尝试基于行数进行合并或更新。也许我可以通过创建一个临时表来解决修改自我约束的问题?我相当有信心Oracl
本文向大家介绍JavaScript数组随机排列实现随机洗牌功能,包括了JavaScript数组随机排列实现随机洗牌功能的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript数组随机排列实现随机洗牌功能的方法。分享给大家供大家参考。具体分析如下: 这段JS代码可以对数组内的元素进行随机排列,这个非常有用,比如我们在玩扑克牌的时候可以让扑克牌进行排列,也就是电脑洗牌。 希望本文所
问题内容: 我有一个非常大的矩阵A,具有N行和M列。我想基本上做以下操作 但又快又有效。(M和N都很大,这只是更大的外部循环中的内部循环。) 更多上下文:我正在尝试对相关矩阵实施置换测试(http://en.wikipedia.org/wiki/Resampling_%28statistics%29)。我的数据很大,我很不耐烦。如果有人知道实现这种测试的快速方法,我也将不胜感激! 我是否希望避免循
问题内容: 我正在创建一个测验,每当我开始测验时,我都希望将问题打乱,以免每次出现时都不会以相同的顺序出现。 我在我的html代码中有这个: 这在我的控制器中 不幸的是,这根本没有用。希望有人可以帮助我吗? 问题答案: 谢谢 http://bost.ocks.org/mike/shuffle/ 使用此改组功能: 它的特殊之处在于,输入数组保持可绑定性,因为改组不会创建新的数组,而是 对同一引用 执