1.Fisher–Yates shuffle algorithm (original)
var items = ["A", "B", "C", "D", "E", "F", "G", "H"]
var shuffled = [String]();
for i in 0..<items.count
{
let rand = Int(arc4random_uniform(UInt32(items.count)))
shuffled.append(items[rand])
items.remove(at: rand)
}
print(shuffled)
2.Knuth Shuffle: Fisher–Yates shuffle algorithm (modern)
https://developer.apple.com/videos/play/wwdc2018/406/?time=1289
(동영상 "Fisher–Yates shuffle" 부분은 23:05 ~ )
애플의 shuffle 메소드는 이 방식으로 구현됐다.
var items = ["A", "B", "C", "D", "E", "F", "G", "H"]
var last = items.count - 1
while(last > 0)
{
let rand = Int(arc4random_uniform(UInt32(last)))
print("swap items[\(last)] = \(items[last]) with items[\(rand)] = \(items[rand])")
items.swapAt(last, rand)
print(items)
last -= 1
}
original과 달리 두 개의 Collection이 필요없다.
https://daheenallwhite.github.io/programming/algorithm/2019/06/27/Shuffle-Algorithm-Fisher-Yates/
3. navie shuffle algorithm
vs Fisher–Yates shuffle
https://dyladan.me/abc/2016/01/20/shuffle/
https://gist.github.com/robertmryan/b002b7d524646fd677bb3979c89ec331
extension Array {
/// Simple implementation of Fisher-Yates
mutating func shuffle() {
for i in 0 ..< count - 1 {
let j = i + Int(arc4random_uniform(UInt32(count - i)))
swapAt(i, j)
}
}
/// Naive implementation that introduces biases
mutating func shuffleBiased() {
for i in 0 ..< count {
let j = Int(arc4random_uniform(UInt32(count)))
swapAt(i, j)
}
}
}
navie shuffle은 편향된 셔플 결과를 보이는 반면 Fisher-Yates shuffle은 항상 비슷한 셔플 결과를 보인다.
shuffle()
, shuffled()
shuffle()
: https://developer.apple.com/documentation/swift/emptycollection/2995458-shuffle
shuffled()
:
https://developer.apple.com/documentation/swift/array/2994757-shuffled
공통점 : Collection의 value들을 섞는다, 복잡도가 O(n)이다
차이점: shuffled 메소드는 셔플한 Collection을 반환한다.
recursive
lhs와 rhs를 비교하는 메소드에 lhs == rhs 를 리턴하는 코드를 구현해서 다시 lhs와 rhs를 비교하는 메소드를 호출한다 -> recursive.
따라서 lhs 와 rhs 의 어떤 속성을 비교했을 때 같다고 판단하는지를 메소드에 명시해줘야 한다.
xcode playgournd code folding ribbon -> depth를 볼 수 있다.
[ 실패 하나 😊 ]
테스트 코드를 먼저 작성해놔도 Equatable을 제대로 작성하지 않아서 시간을 많이 빼겼다. 오늘 새로 알게된 점 5번과 관련된 내용이다.
[ 결론 👩💻 ]
일단 만들어놓고 print 찍어봐야지 하는 생각보다는 이 테스트가 동작이 되게 해야겠다는 식의 목표가 있는 접근이 좋았다. 다만 고민거리는 있었다. 테스트 함수는 여러 값 중에서 어떤 값을 테스트 하는 게 좋을지, 어디부터 어디까지 테스트해야 하는지. 앞으로 테스트 함수를 많이 짜봐야겠다.
[ 성공 둘 😊 ]
크로스핏을 시작했다.
[ 결론 👩💻 ]
각자 자기 페이스에 맞춰서 다같이 하는 운동이다. 그럼면에서 프로그래밍과 같은 것 같다. 2-3월은 그래서 운동을 하면서 마음을 계속 다잡아야겠다.
🧐❓: 테스트 함수를 통과한 코드가 신뢰가 있으려면 테스트 코드로 어떤 걸 테스트 해야할까?
😁 ❗️
... 찾아서 업데이트 할 예정.
내일 아침에 정리하겠습니다....ㅠ
일단 enum이나 테스트 코드, 랜덤이 진짜 랜덤인지 테스트하는 방법, set함수 등
객체 지향적으로 iOS 코드를 짠다는게 어떤건지 알아보기
View LifeCycle 알아보기
https://velog.io/@delmasong/Understand-the-View-Controller-LifeCycle
View와 Window, view와 ViewController의 관계 알아보기 (공식문서 읽기)
시도해보고 실패한걸 시간 날렸다고 생각하지 말자.
어차피 다 필요한 과정이고 삽질 하면서 배운다.