你好,
我有一个非常基础的问题:
如何在Swift中创建一个20位数字的随机数,不包含小数和负数(即整数)?
感谢所有的回答XD。
你好,
我有一个非常基础的问题:
如何在Swift中创建一个20位数字的随机数,不包含小数和负数(即整数)?
感谢所有的回答XD。
首先,我们需要扩展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)
}
}
这可以这样使用:
Int(0...9) // 4 or 1 or 1...
Int(10...99) // 90 or 33 or 11
Int(100...999) // 200 or 333 or 893
现在我们需要一个函数来接收所需的位数,计算随机数的范围,并最终调用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)
}
random(1) // 8
random(2) // 12
random(3) // 829
random(4) // 2374
random
函数转换为UInt
的扩展。 - Luca AngelettiUInt32(..)
计算的范围包括负数(这不是此问题的情况),则在64位平台上可能会溢出。尝试let rnd = Int(Int.min + 10 ..< Int.max - 10)
(它会崩溃)。以下是一种安全的方法来生成任意整数范围内的随机数:http://stackoverflow.com/questions/31391577/how-can-i-generate-large-ranged-random-numbers-in-swift。 - Martin RSwift 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
注意:该函数将返回一个 String
类型的值。如果您需要得到一个 Int
类型的值,可以像这样操作:
let number = Int(random(digits: 1)) ?? 0
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
}
Swift 3 appzyourlifz的答案已更新为Swift 3
步骤1:
extension Int {
init(_ range: Range<Int> ) {
let delta = range.lowerBound < 0 ? abs(range.lowerBound) : 0
let min = UInt32(range.lowerBound + delta)
let max = UInt32(range.upperBound + delta)
self.init(Int(min + arc4random_uniform(max - min)) - delta)
}
}
步骤二:
func randomNumberWith(digits:Int) -> Int {
let min = Int(pow(Double(10), Double(digits-1))) - 1
let max = Int(pow(Double(10), Double(digits))) - 1
return Int(Range(uncheckedBounds: (min, max)))
}
使用方法:
randomNumberWith(digits:4) // 2271
randomNumberWith(digits:8) // 65273410
你可以创建一个字符串数字,然后将该数字转换为所需的数字。
func generateRandomDigits(_ digitNumber: Int) -> String {
var number = ""
for i in 0..<digitNumber {
var randomNumber = arc4random_uniform(10)
while randomNumber == 0 && i == 0 {
randomNumber = arc4random_uniform(10)
}
number += "\(randomNumber)"
}
return number
}
print(Int(generateRandomDigits(3)))
如果要使用20位数字,可以使用Double而不是Int。
这里是一个UInt64中的18个十进制数字:
(Swift 3)
let sz: UInt32 = 1000000000
let ms: UInt64 = UInt64(arc4random_uniform(sz))
let ls: UInt64 = UInt64(arc4random_uniform(sz))
let digits: UInt64 = ms * UInt64(sz) + ls
print(String(format:"18 digits: %018llu", digits)) // Print with leading 0s.
一个以1..9为首位的16位十进制数字在UInt64中:
let sz: UInt64 = 100000000
let ld: UInt64 = UInt64(arc4random_uniform(9)+1)
let ms: UInt64 = UInt64(arc4random_uniform(UInt32(sz/10)))
let ls: UInt64 = UInt64(arc4random_uniform(UInt32(sz)))
let digits: UInt64 = ld * (sz*sz/10) + (ms * sz) + ls
print(String(format:"16 digits: %llu", digits))
Unome的验证响应加强版的Swift 4版本:
防止溢出和0位数字
添加对Linux设备的支持,因为“arc4random *”函数不存在
在使用Linux设备时,请不要忘记执行以下操作
#if os(Linux)
srandom(UInt32(time(nil)))
#endif
/// This function generate a random number of type Int with the given digits number
///
/// - Parameter digit: the number of digit
/// - Returns: the ramdom generate number or nil if wrong parameter
func randomNumber(with digit: Int) -> Int? {
guard 0 < digit, digit < 20 else { // 0 digit number don't exist and 20 digit Int are to big
return nil
}
/// The final ramdom generate Int
var finalNumber : Int = 0;
for i in 1...digit {
/// The new generated number which will be add to the final number
var randomOperator : Int = 0
repeat {
#if os(Linux)
randomOperator = Int(random() % 9) * Int(powf(10, Float(i - 1)))
#else
randomOperator = Int(arc4random_uniform(9)) * Int(powf(10, Float(i - 1)))
#endif
} while Double(randomOperator + finalNumber) > Double(Int.max) // Verification to be sure to don't overflow Int max size
finalNumber += randomOperator
}
return finalNumber
}