ios - 如何在 iOS 中只获取一次随机数

标签 ios swift random

我想为 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/

相关文章:

ios - iPhone 设备中的 Json 解析错误,但在模拟器中正确

ios - 如何在 SpriteKit 中制作一个简单的角色 Controller ?

swift - 如何创建全局导入以在所有应用程序中使用?

Android,随机不会连续两次重复相同的数字

javascript - 如何在js中分散随机定位的图像?

iOS GLSL。有没有办法使用 GLSL 着色器创建图像直方图?

c# - Unity3D游戏: deal with constants within one file

swift - 在 macOS SwiftUI TextEditor 中显示行号

algorithm - 具有 FP16 限制的 GLSL-ES 随机颗粒噪声

ios - UICollectionView 仅防止第一个单元格重复使用单元格