用Swift生成随机数字

我需要生成一个随机数。

看来arc4random函数不再像arc4random_uniform函数一样存在。

我有的选项是arc4random_stir()arc4random_buf(UnsafeMutablePointer<Void>, Int)arc4random_addrandom(UnsafeMutablePointer<UInt8>, Int32)

我找不到任何文档的function和头文件没有评论给提示。

arc4random()返回04 294 967 295范围内的一个随机数

drand48()返回一个范围为0.01.0的随机数

arc4random_uniform(N)返回0N-1范围内的一个随机数

例子:

 arc4random() // => UInt32 = 2739058784 arc4random() // => UInt32 = 2672503239 arc4random() // => UInt32 = 3990537167 arc4random() // => UInt32 = 2516511476 arc4random() // => UInt32 = 3959558840 drand48() // => Double = 0.88642843322303122 drand48() // => Double = 0.015582849408328769 drand48() // => Double = 0.58409022031727176 drand48() // => Double = 0.15936862653180484 drand48() // => Double = 0.38371587480719427 arc4random_uniform(3) // => UInt32 = 0 arc4random_uniform(3) // => UInt32 = 1 arc4random_uniform(3) // => UInt32 = 0 arc4random_uniform(3) // => UInt32 = 1 arc4random_uniform(3) // => UInt32 = 2 

arc4random_uniform()build议比arc4random() % upper_bound这样的结构arc4random() % upper_bound因为它避免了“模偏差”,当上界不是二的幂。

你也可以尝试一下:

 let diceRoll = Int(arc4random_uniform(UInt32(6))) 

我不得不添加“UInt32”,使其工作。

经过一番调查,我写了这个:

 import Foundation struct Math { private static var seeded = false static func randomFractional() -> CGFloat { if !Math.seeded { let time = Int(NSDate().timeIntervalSinceReferenceDate) srand48(time) Math.seeded = true } return CGFloat(drand48()) } } 

现在你可以做Math.randomFraction()来得到随机数字[0..1 [不必记住先播种。 希望这可以帮助别人:o)

只要调用这个函数,并提供最小和最大范围的数字,你会得到一个随机数。

例如randomNumber(MIN:0,MAX:10) ,您将得到0到9之间的数字。

 func randomNumber(MIN: Int, MAX: Int)-> Int{ return Int(arc4random_uniform(UInt32(MAX)) + UInt32(MIN)); } 

注意: – 您将始终得到输出一个整数。

另一种select是使用xorshift128plusalgorithm:

 func xorshift128plus(seed0 : UInt64, _ seed1 : UInt64) -> () -> UInt64 { var state0 : UInt64 = seed0 var state1 : UInt64 = seed1 if state0 == 0 && state1 == 0 { state0 = 1 // both state variables cannot be 0 } func rand() -> UInt64 { var s1 : UInt64 = state0 let s0 : UInt64 = state1 state0 = s0 s1 ^= s1 << 23 s1 ^= s1 >> 17 s1 ^= s0 s1 ^= s0 >> 26 state1 = s1 return UInt64.addWithOverflow(state0, state1).0 } return rand } 

该algorithm的周期为2 ^ 128-1,并通过BigCrushtesting套件的所有testing。 注意,虽然这是一个长周期的高质量伪随机数发生器, 但它不是一个密码安全的随机数发生器

您可以从当前时间或任何其他随机的熵源中播种。 例如,如果您有一个名为urand64()的函数从/dev/urandom读取UInt64 ,则可以这样使用它:

 let rand = xorshift128plus(urand64(), urand64()) for _ in 1...10 { print(rand()) } 
 let MAX : UInt32 = 9 let MIN : UInt32 = 1 func randomNumber() { var random_number = Int(arc4random_uniform(MAX) + MIN) print ("random = ", random_number); } 

你可以使用这个具体的速度:

 let die = [1, 2, 3, 4, 5, 6] let firstRoll = die[Int(arc4random_uniform(UInt32(die.count)))] let secondRoll = die[Int(arc4random_uniform(UInt32(die.count)))] 

在Swift 3:

它会产生0到0之间的随机数字

 let limit : UInt32 = 6 print("Random Number : \(arc4random_uniform(limit))") 

让随机数字或随机string的Swift的代码:)

 let quotes: NSArray = ["R", "A", "N", "D", "O", "M"] let randomNumber = arc4random_uniform(UInt32(quotes.count)) let quoteString = quotes[Int(randomNumber)] print(quoteString) 

它会随机给你输出。

我的实现作为一个Int扩展。 将生成from..<to范围内的随机数字

 public extension Int { static func random(from: Int, to: Int) -> Int { guard to > from else { assertionFailure("Can not generate negative random numbers") return 0 } return Int(arc4random_uniform(UInt32(to - from)) + UInt32(from)) } } 

不要忘记一些数字会重复! 所以你需要做一些像….

我的总问题是47。

 func getRandomNumbers(totalQuestions:Int) -> NSMutableArray { var arrayOfRandomQuestions: [Int] = [] print("arraySizeRequired = 40") print("totalQuestions = \(totalQuestions)") //This will output a 40 random numbers between 0 and totalQuestions (47) while arrayOfRandomQuestions.count < 40 { let limit: UInt32 = UInt32(totalQuestions) let theRandomNumber = (Int(arc4random_uniform(limit))) if arrayOfRandomQuestions.contains(theRandomNumber) { print("ping") } else { //item not found arrayOfRandomQuestions.append(theRandomNumber) } } print("Random Number set = \(arrayOfRandomQuestions)") print("arrayOutputCount = \(arrayOfRandomQuestions.count)") return arrayOfRandomQuestions as! NSMutableArray } 

这是我如何获得2 int之间的随机数!

 func randomNumber(MIN: Int, MAX: Int)-> Int{ var list : [Int] = [] for i in MIN...MAX { list.append(i) } return list[Int(arc4random_uniform(UInt32(list.count)))] } 

用法:

 print("My Random Number is: \(randomNumber(MIN:-10,MAX:10))") 

看,我有同样的问题,但我作为一个全局variables插入函数

 var RNumber = Int(arc4random_uniform(9)+1) func GetCase(){ your code } 

显然这不是有效的,所以然后我只是复制和粘贴到函数的代码,所以它可以重用,然后xcodebuild议我设置为常量,所以我的代码是

 func GetCase() { let RNumber = Int(arc4random_uniform(9)+1) if categoria == 1 { } } 

以及这是我的代码的一部分,所以xcode告诉我一些无用的和初始化的东西,但是,它build立的应用程序无论如何,该build议只是消失

希望能帮助到你