[Swift] 随机数 | Random numbers
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ )
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10305789.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
(1)、生成随机数
random(in:) :适用于所有数字类型生成随机数的方法 ,它返回给定范围内的随机数。并且适用于布尔类型。
1 print(Int.random(in: -100...100)) 2 //Print -89 3 4 print(Int32.random(in: -100...100)) 5 //Print 75 6 7 print(Int64.random(in: -100...100)) 8 //Print 98 9 10 print(UInt32.random(in: 0...100)) 11 //Print 4 12 13 print(UInt64.random(in: .min ... .max)) 14 //Print 3163649096186785965 15 16 print(Double.random(in: 0..<1)) 17 //Print 0.42567458317242557 18 19 print(Float.random(in: 0..<1)) 20 //Print 0.7992699 21 22 print(Bool.random()) 23 //Print true
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数。
这个api也很好的避免了modulo bias偏差的发生。
1 func coinToss(count tossCount: Int) -> (heads: Int, tails: Int) { 2 var tally = (heads: 0, tails: 0) 3 for _ in 0..<tossCount { 4 let isHeads = Bool.random() 5 if isHeads { 6 tally.heads += 1 7 } else { 8 tally.tails += 1 9 } 10 } 11 return tally 12 } 13 14 //测试 15 let (heads, tails) = coinToss(count: 1000) 16 print("1000 coin tosses — heads: \(heads), tails: \(tails)") 17 //Print 1000 coin tosses — heads: 496, tails: 504
(2)、集合的随机元素:randomElement()
randomElement()方法的返回值为可选类型。
如果集合为空集合,则返回的值为nil
。
1 let arr1:[Int] = [] 2 print(arr1.randomElement()) 3 //Print nil 4 5 6 let arr2:[String] = ["s","t","r","e","n","g","t","h","e","n"] 7 8 //Optional可选类型 9 print(arr2.randomElement()) 10 //Print Optional("g") 11 12 //强制解包使用用感叹号! 13 print(arr2.randomElement()!) 14 //Print g
(3)、集合元素随机顺序:shuffle()
适用于MutableCollection和RandomAccessCollection的所有类型。
1 let numbers = (1...10).shuffled() 2 print(numbers) 3 //Print [2, 7, 6, 5, 3, 10, 9, 1, 8, 4] 4 5 let mutableNumbers = Array(10...20).shuffled() 6 print(mutableNumbers) 7 //Print [14, 13, 20, 16, 18, 17, 19, 12, 15, 11, 10] 8 9 let arr:[String] = ["s","t","r","e","n","g","t","h","e","n"].shuffled() 10 print(arr) 11 //Print ["s", "r", "h", "e", "n", "t", "t", "g", "e", "n"]
(4)、自定义随机数生成器
标准库附带一个默认的随机数生成器Random.default,对于大多数简单的用例是一个不错的选择。
如果有特殊要求,可以采用RandomNumberGenerator协议实现自己的随机数生成器。
用于生成随机值的所有API都提供了一个允许用户传入其首选随机数生成器的重载:
1 //一个模拟“random.default”的伪随机数生成器。 2 struct MyRandomNumberGenerator: RandomNumberGenerator { 3 var base = Random.default 4 mutating func next() -> UInt64 { 5 return base.next() 6 } 7 } 8 9 var customRNG = MyRandomNumberGenerator() 10 Int.random(in: 0...100, using: &customRNG) 11 //Print 4
(5)、扩展您随机数Random类型
可以按照相同的模式,为您自己的类型提供随机数据API。
1 enum Suit: String, CaseIterable { 2 case diamonds = "♦" 3 case clubs = "♣" 4 case hearts = "♥" 5 case spades = "♠" 6 7 static func random<T: RandomNumberGenerator>(using generator: inout T) -> Suit { 8 // Using CaseIterable for the implementation 9 return allCases.randomElement(using: &generator)! 10 11 } 12 13 static func random() -> Suit { 14 return Suit.random(using: &Random.default) 15 } 16 } 17 18 let randomSuit = Suit.random() 19 randomSuit.rawValue 20 //Print ♣
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)