随机健身APP:按元素所属数组配置不同随机数范围
解决按动作类型分配不同随机次数范围的问题
嘿,这个需求其实挺接地气的——毕竟不同健身动作的合理次数范围确实差很多,总不能让硬拉和俯卧撑用同一个次数区间对吧?我来给你分享个简单靠谱的实现思路,用Swift来举例(毕竟你提到了arc4random):
第一步:给动作绑定专属的次数范围
与其单纯用两个数组区分,不如让每个动作自己“记住”适合的次数区间。最清晰的方式是用结构体来封装动作信息:
// 定义一个动作结构体,包含名称、最小次数、最大次数 struct Exercise { let name: String let minReps: Int let maxReps: Int } // 按类型分组定义动作数组 let highRepExercises = [ Exercise(name: "俯卧撑", minReps: 15, maxReps: 30), Exercise(name: "开合跳", minReps: 20, maxReps: 40), Exercise(name: "卷腹", minReps: 12, maxReps: 25) ] let standardRepExercises = [ Exercise(name: "哑铃卧推", minReps: 8, maxReps: 12), Exercise(name: "硬拉", minReps: 5, maxReps: 8), Exercise(name: "弓步蹲", minReps: 6, maxReps: 10) ]
第二步:修改生成计划的逻辑,按动作的次数范围生成随机数
在你的「生成训练计划」函数里,先随机选动作(可以控制不同类型动作的占比),然后根据选中动作的minReps和maxReps来生成对应的随机次数:
func generateWorkoutPlan() -> [(exerciseName: String, reps: Int)] { var workoutPlan = [(String, Int)]() // 随机生成本次训练的动作数量,比如3-6个 let totalExercises = Int(arc4random_uniform(4)) + 3 for _ in 0..<totalExercises { // 随机选择动作类型:比如40%概率选高次数动作,60%选标准次数动作 let isHighRep = arc4random_uniform(10) < 4 let selectedExercise: Exercise // 从对应数组里随机选一个动作 if isHighRep { let randomIndex = Int(arc4random_uniform(UInt32(highRepExercises.count))) selectedExercise = highRepExercises[randomIndex] } else { let randomIndex = Int(arc4random_uniform(UInt32(standardRepExercises.count))) selectedExercise = standardRepExercises[randomIndex] } // 生成该动作对应的随机次数 let repsRange = selectedExercise.maxReps - selectedExercise.minReps + 1 let randomReps = Int(arc4random_uniform(UInt32(repsRange))) + selectedExercise.minReps workoutPlan.append((selectedExercise.name, randomReps)) } return workoutPlan }
额外优化建议
- 如果以后要加更多动作类型(比如低次数大重量的力量动作),直接新增对应的数组和结构体实例就行,扩展性拉满;
- 要是不想用结构体,也可以用元组数组
[(String, Int, Int)]或者字典数组,不过结构体的类型安全性更高,不容易出错; - 还可以给动作加个难度标签、肌肉部位等属性,以后扩展功能(比如按部位生成计划)也更方便。
这样改完,每个动作都会按照自己的合理次数范围生成随机数,完全符合你的需求啦~
内容的提问来源于stack exchange,提问作者nc14
相关产品推荐
相关产品推荐

