Mat*_*tyG 3 arrays sorting shuffle date swift
我想要对一组Any对象进行洗牌,但在当前日历日期间每次执行洗牌时,顺序都应该保持一致。
let myArray = [1, 2, 3, 4, 5]
print(myArray.myShuffleForDateFunction(Date()))
//output today is always e.g. [3, 5, 1, 2, 4]
//output tomorrow is always e.g. [1, 4, 5, 3, 2], etc
Run Code Online (Sandbox Code Playgroud)
所以想要一些随机顺序生成器,我用今天的日期播种,例如
let todayAtMidnight = Calendar.current.startOfDay(for: Date())
let secondsSince1970UntilTodayAtMidnight = todayAtMidnight.timeIntervalSince1970
Run Code Online (Sandbox Code Playgroud)
我已经看过了shuffle(using:),但是我可以向它传递一个用我的日期播种的生成器吗?或者还有其他我可以使用的东西吗?
像这样的东西吗?
我查找了如何播种随机数生成器并找到了这个主题: Generate random number in swift
使用您的技术将今天的午夜日期作为数字...您可以播种数字生成器并在每个午夜日期获得相同的随机序列。
import GameplayKit
let myArray = [1, 2, 3, 4, 5]
let calendar = Calendar.current
let todayAtMidnight = calendar.startOfDay(for: Date())
let seed = UInt64(todayAtMidnight.timeIntervalSince1970)
var mersenneTwister = GKMersenneTwisterRandomSource(seed: seed)
let fixedArrayByDate = mersenneTwister.arrayByShufflingObjects(in: myArray)
print(fixedArrayByDate)
Run Code Online (Sandbox Code Playgroud)
打印出今天的日期:
[2, 3, 4, 1, 5]
Run Code Online (Sandbox Code Playgroud)
正如丹尼尔所建议的,人们可以设置一个扩展来获得乐趣:
import GameplayKit
extension Array {
func shuffledByDate(_ date: Date) -> [Any] {
let calendar = Calendar.current
let todayAtMidnight = calendar.startOfDay(for: date)
let seed = UInt64(todayAtMidnight.timeIntervalSince1970)
let mersenneTwister = GKMersenneTwisterRandomSource(seed: seed)
return mersenneTwister.arrayByShufflingObjects(in: self)
}
}
let myArray = [1, 2, 3, 4, 5].shuffledByDate(Date())
print(myArray)
Run Code Online (Sandbox Code Playgroud)