【问题标题】:Shuffle an array with a consistent order, based on today's date - Swift根据今天的日期,以一致的顺序随机排列数组 - Swift
【发布时间】:2020-06-28 00:05:41
【问题描述】:

我想随机播放一组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

所以想要一些我用今天的日期播种的随机订单生成器,例如

let todayAtMidnight = Calendar.current.startOfDay(for: Date())
let secondsSince1970UntilTodayAtMidnight = todayAtMidnight.timeIntervalSince1970

我查看了shuffle(using:),但我可以将一个以我的日期作为种子的生成器传递给它,还是我可以使用其他东西?

【问题讨论】:

  • 为什么不洗牌一次,如果你那天洗牌了,就不要再洗牌了?或者你的意思是世界上每个在那天洗牌的人都应该得到相同的顺序,就像一种一次性垫?
  • @matt 我想将此逻辑用于应用程序中的多个数组,因此不想跟踪每个数组的“hasBeenShuffledToday”状态
  • @matt,有趣的是你提出了世界上每个人都得到相同的想法,因为我不一定要求这样做,但如果我这样做会使分析更强大可以根据日期追溯生成排序顺序。
  • “我想对应用程序中的几个数组使用这个逻辑,所以不想跟踪每个数组的 'hasBeenShuffledToday' 状态”这听起来像是属性包装器的完美用例。
  • 谢谢@sweeper,我也会调查一下

标签: arrays swift sorting date shuffle


【解决方案1】:

这样的?

我查找了如何播种随机数生成器并找到了这个主题: Generating random numbers 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)

今天的日期打印出来:

[2, 3, 4, 1, 5]

正如 Daniel 所建议的,可以设置一个扩展来获得乐趣:

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)

【讨论】:

  • 为了获得更多乐趣,您可以将其包装在扩展程序 func shuffledByDate() 或类似的东西中。
  • 感谢加布里埃尔。我使用GKLinearCongruentialRandomSource 而不是GKMersenneTwisterRandomSource,因为我更喜欢执行速度而不是质量随机性。干杯
猜你喜欢
  • 2013-06-30
  • 2022-11-13
  • 2012-05-25
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
相关资源
最近更新 更多