Mer*_*ury 5 random range swift
HY,
我有一个非常基本的问题是:
如何在Swift中创建一个20位数的随机数,没有浮动没有负数(基本上是一个Int)?
感谢所有答案XD
Luc*_*tti 12
首先,我们需要一个扩展Int来生成一个范围内的随机数.
extension Int {
init(_ range: Range<Int> ) {
let delta = range.startIndex < 0 ? abs(range.startIndex) : 0
let min = UInt32(range.startIndex + delta)
let max = UInt32(range.endIndex + delta)
self.init(Int(min + arc4random_uniform(max - min)) - delta)
}
}
Run Code Online (Sandbox Code Playgroud)
这可以这样使用:
Int(0...9) // 4 or 1 or 1...
Int(10...99) // 90 or 33 or 11
Int(100...999) // 200 or 333 or 893
Run Code Online (Sandbox Code Playgroud)
现在我们需要一个接收所请求位数的函数,计算随机数的范围,最后调用新的初始值Int.
func random(digits:Int) -> Int {
let min = Int(pow(Double(10), Double(digits-1))) - 1
let max = Int(pow(Double(10), Double(digits))) - 1
return Int(min...max)
}
Run Code Online (Sandbox Code Playgroud)
random(1) // 8
random(2) // 12
random(3) // 829
random(4) // 2374
Run Code Online (Sandbox Code Playgroud)
Swift 5:简单的解决方案
func random(digits:Int) -> String {
var number = String()
for _ in 1...digits {
number += "\(Int.random(in: 1...9))"
}
return number
}
print(random(digits: 1)) //3
print(random(digits: 2)) //59
print(random(digits: 3)) //926
Run Code Online (Sandbox Code Playgroud)
注意它会返回值String,如果你需要Int值,那么你可以这样做
let number = Int(random(digits: 1)) ?? 0
Run Code Online (Sandbox Code Playgroud)
这是一些伪代码,应该可以完成您想要的操作。
generateRandomNumber(20)
func generateRandomNumber(int numDigits){
var place = 1
var finalNumber = 0;
for(int i = 0; i < numDigits; i++){
place *= 10
var randomNumber = arc4random_uniform(10)
finalNumber += randomNumber * place
}
return finalNumber
}
Run Code Online (Sandbox Code Playgroud)
它非常简单。您生成 20 个随机数,并将它们分别乘以它们应该所在的十位、百位、千位……。这样,您将保证数字的大小正确,但会随机生成将在每个地方使用的数字。
更新
正如评论中所说,您很可能会遇到这么长的数字溢出异常,因此您必须在如何存储数字(字符串等)方面发挥创意,但我只是想向您展示一种生成具有保证数字长度的数字的简单方法。另外,考虑到当前的代码,您的前导数字有可能为 0,因此您也应该防止这种情况发生。