作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为 iOS 开发一款励志应用。使用此代码随机选择动机句子。
arc4random_uniform(100)
问题:代码显示示例 2 和另一个 2,以便用户再次获得相同的句子。
我需要从某个范围(例如 100)中仅获取一次随机数的东西,并且在每个数字之后代码应该重复自身,以便用户可以再次看到激励性句子。
最佳答案
您可以使用 Set 来过滤已经提取的数字(Sets 包含唯一元素),并执行类似这样的操作
import Foundation
var setOfNumbers: Set<UInt32> = []
func extractUniqueNumber(with treshold: UInt32, alreadyExtracted: inout Set<UInt32>) -> UInt32? {
guard alreadyExtracted.count < treshold else { return nil }
let randomNumber = arc4random_uniform(treshold)
if !alreadyExtracted.contains(randomNumber) {
alreadyExtracted.insert(randomNumber)
return randomNumber
} else {
return extractUniqueNumber(with: treshold, alreadyExtracted: &alreadyExtracted)
}
}
// test it out with a number of tries
for _ in 0...100 {
if let number = extractUniqueNumber(with: 100, alreadyExtracted: &setOfNumbers) {
print("Your number is: \(number).\n- Previously extracted numbers) are: \(setOfNumbers)")
} else {
print("You have extracted all numbers already")
}
}
如果提取数字的顺序很重要,可以将 Set 替换为 Array。付出的代价是对已经提取的数字的搜索速度变慢,但在 100 的范围内很可能仍然没问题。在这种情况下,代码将是
var setOfNumbers: [UInt32] = []
func extractUniqueNumber(with treshold: UInt32, alreadyExtracted: inout [UInt32]) -> UInt32? {
guard alreadyExtracted.count < treshold else { return nil }
let randomNumber = arc4random_uniform(treshold)
if !alreadyExtracted.contains(randomNumber) {
alreadyExtracted.append(randomNumber)
return randomNumber
} else {
return extractUniqueNumber(with: treshold, alreadyExtracted: &alreadyExtracted)
}
}
关于ios - 如何在 iOS 中只获取一次随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49955884/
我是一名优秀的程序员,十分优秀!