用Swift生成随机数字
我需要生成一个随机数。
看来arc4random
函数不再像arc4random_uniform
函数一样存在。
我有的选项是arc4random_stir()
, arc4random_buf(UnsafeMutablePointer<Void>, Int)
和arc4random_addrandom(UnsafeMutablePointer<UInt8>, Int32)
。
我找不到任何文档的function和头文件没有评论给提示。
arc4random()
返回0到4 294 967 295范围内的一个随机数
drand48()
返回一个范围为0.0到1.0的随机数
arc4random_uniform(N)
返回0到N-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议只是消失
希望能帮助到你