Swift生成随机数或处理随机化的功能
Swift生成随机数或处理随机化的功能

Swift生成随机数或处理随机化的功能

Swift 提供了其他多种生成随机数或处理随机化的功能。以下是一些与随机相关的类似方法和功能:

1、shuffle() 和 shuffled()

用于打乱数组或序列中的元素顺序。

示例

var numbers = [1, 2, 3, 4, 5]
numbers.shuffle() // 原地打乱数组
print(numbers) // 可能输出:[5, 2, 1, 4, 3]

let shuffledNumbers = numbers.shuffled() // 返回打乱后的新数组
print(numbers)  // 可能输出:[5, 2, 1, 4, 3]
print(shuffledNumbers) // 可能输出:[5, 3, 4, 1, 2]

特点

shuffle():原地修改数组。

shuffled():返回一个新数组,不改变原数组。

2、randomElement()

从数组或序列中随机选取一个元素。

示例

let fruits = ["苹果", "香蕉", "橘子"]
if let randomFruit = fruits.randomElement() {
    print("随机选择的水果是 \(randomFruit)") // 可能输出:"香蕉"
}

特点

返回一个可选值 (Optional)。

如果序列为空,返回 nil。

3、stride(from:to:by:) 和 stride(from:through:by:)

用于生成步进范围,结合随机方法可以用来生成非连续的随机数。

示例

let strides = Array(stride(from: 0, to: 20, by: 5)) // [0, 5, 10, 15]
let randomStride = strides.randomElement()
print(randomStride ?? "无随机值") // 可能输出:15

参数

1)stride(from:to:by:):从指定的起点开始,每次增加指定的步长,直到到达(但不包括)终点。

from:起始值(包含)。

to:终止值(不包含)。

by:步长,可以是正数(递增)或负数(递减)。

特点:不包括终点。

2)stride(from:through:by:):从指定的起点开始,每次增加指定的步长,直到到达或穿过终点。

from:起始值(包含)。

through:终止值(包含)。

by:步长,可以是正数(递增)或负数(递减)。

特点:包括终点。

for i in stride(from: 0, through: 10, by: 2) {
    print(i) // 输出: 0, 2, 4, 6, 8, 10
}

注意事项

1)步长不能为 0

设置 by: 0 会导致运行时崩溃。

2)步长的正负

by 为正数时,from 必须小于 to/through。

by 为负数时,from 必须大于 to/through。

4、arc4random 系列 (C 库方法)

Swift 支持调用基于 C 的 arc4random 方法生成随机数。虽然现代 Swift 更推荐使用 Int.random(in:),但这些方法仍可用。

示例

let randomInt = Int(arc4random_uniform(100)) // 生成 0 到 99 的随机整数
print(randomInt) // 可能输出 11

特点

arc4random_uniform(_:):避免了直接使用 % 运算符可能导致的偏差问题。

arc4random():生成 UInt32 范围的随机值。

5、GKRandomSource (GameplayKit 提供的随机数)

GKRandomSource 提供更可控和高质量的随机数生成器,适用于游戏或更复杂的场景。

示例

import GameplayKit

let randomSource = GKRandomSource.sharedRandom()
let randomNumber = randomSource.nextInt(upperBound: 100) // 0 到 99 的随机整数
print(randomNumber) // 可能输出 92

特点

可选用不同的随机算法,如 GKMersenneTwisterRandomSource 或 GKARC4RandomSource。

提供对随机数生成的更多控制。

6、UUID()

用于生成唯一标识符(通常用于随机 ID)。

示例

let randomUUID = UUID().uuidString
print(randomUUID) // 输出类似:" CF8D01EF-29AF-44EB-90F3-0DB462468ABC"

特点

返回一个全球唯一的字符串。

常用于标识唯一对象或实例。

7、CryptoKit 的随机数生成

如果需要更高安全级别的随机数,可以使用 CryptoKit 提供的工具,例如 SecureRandomNumberGenerator。

示例

import CryptoKit

var secureRandomBytes = [UInt8](repeating: 0, count: 16)
_ = SecRandomCopyBytes(kSecRandomDefault, secureRandomBytes.count, &secureRandomBytes)
print(secureRandomBytes) // 可能输出:[61, 15, 239, 36, 113, 157, 52, 141, 241, 112, 146, 46, 76, 133, 43, 224]

特点

用于安全性要求高的随机数(如密码学应用)。

提供比 SystemRandomNumberGenerator 更强的随机性。

8、SystemRandomNumberGenerator

Swift 默认的随机数生成器,支持自定义场景。

示例

var generator = SystemRandomNumberGenerator()
let randomInt = Int.random(in: 1...100, using: &generator)
print(randomInt)	// 可能输出 95

特点

可自定义随机数生成器的实例。

提供灵活的使用方式。

9、自定义随机方法

通过扩展或闭包实现自己的随机功能。

示例

extension Array {
    func randomPick(count: Int) -> [Element] {
        return Array(shuffled().prefix(count))
    }
}

let numbers = [1, 2, 3, 4, 5]
let randomSubset = numbers.randomPick(count: 3)
print(randomSubset) // 可能输出:[1, 5, 2]

总结

1、Int.random(in:):生成随机整数

2、Double.random(in:):生成随机浮点数

3、Bool.random():生成随机布尔值

4、randomElement():从序列中随机选择一个元素

5、shuffle() / shuffled():打乱序列

6、GKRandomSource 系列:更复杂的随机生成器

7、UUID():生成唯一标识符

8、CryptoKit 的随机数生成:高安全性随机生成

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注