如何使arc4random_uniform()的范围之间的随机数?

所以我在这个codebit的目标是随机掷两个骰子,因为我们都知道你的常规死只有6方面,所以我导入基金会访问arc4random_uniform(UInt32)。 我试图使用(1..7)的范围来避免随机获得0,但是这返回了一个我不太喜欢的错误。 我试图做到这一点:

dice1 = arc4random_uniform(UInt32(1..7)) 

但是,返回

无法find接受提供的参数的“init”的重载

我希望这是足够的信息,你惊人的debs在那里帮助我:)

请注意,我只是在操场上做这个练习来快速练习。 我学习如何做到这一点并不是必须的, 我只是在修改实际的应用程序之前修改过的:D

 //imports random number function import Foundation //creates data storage for dice roll var dice1: UInt32 = 0 var dice2: UInt32 = 0 //counter variable var i = 0 //how many times snake eyes happens var snakeeyes = 0 //how many times a double is rolled var `double` = 0 //rolls dice 100 times while i < 100{ //from here //sets dice roll 

这将返回“范围$ T3”的错误不能转换为UInt32

  dice1 = arc4random_uniform(1..7) dice2 = arc4random_uniform(1..7) 
  //checks for snake eyes if dice1 == 1 && dice2 == 1 { snakeeyes = snakeeyes + 1 } //checks for doubles if dice1 == dice2{ `double` = `double` + 1 } //increases counter i = i + 1 //to here } println("You got Snake Eyes \(snakeeyes) times.") println("You got Doubles, \(`double`) times.") 

我相信你应该做的

 dice1 = arc4random_uniform(6) + 1; 

得到范围1 – 6。我不做iOS目标C,但我也没有任何关于快速语言的知识。 随机方法应该返回一个介于0和5之间的值,而+ 1会使其值介于1和6之间。

如果你需要一个介于10到30之间的范围,那就做吧

 int random = arc4random_uniform(21) + 10; 

我做了一个Inttypes的扩展。 testing它在操场上,希望这是有用的。 它也接受负范围:

 extension Int { static func random(range: Range<Int> ) -> Int { var offset = 0 if range.startIndex < 0 // allow negative ranges { offset = abs(range.startIndex) } let mini = UInt32(range.startIndex + offset) let maxi = UInt32(range.endIndex + offset) return Int(mini + arc4random_uniform(maxi - mini)) - offset } } 

使用像

 var aRandomInt = Int.random(-500...100) // returns a random number within the given range. 

或者将其定义为一个Range扩展,如下所示:

 extension Range { var randomInt: Int { get { var offset = 0 if (startIndex as Int) < 0 // allow negative ranges { offset = abs(startIndex as Int) } let mini = UInt32(startIndex as Int + offset) let maxi = UInt32(endIndex as Int + offset) return Int(mini + arc4random_uniform(maxi - mini)) - offset } } } // usage example: get an Int within the given Range: let nr = (-1000 ... 1100).randomInt 

不less好的答案,但我只是想分享我个人最喜欢的Swift随机数生成函数的正整数:

Swift 2

 func randomNumber(range: Range<Int> = 1...6) -> Int { let min = range.startIndex let max = range.endIndex return Int(arc4random_uniform(UInt32(max - min))) + min } 

Swift 3

这是Swift 3的一个快速更新,作为奖励,它现在适用于任何符合SignedInteger协议的值types – 对于需要指定Int16,Int32等的核心数据应用程序来说更方便。作为一个快速提示,如果你真的需要它在无符号整数上工作,只需复制整个函数,然后用UnsignedIntegerreplaceSignedIntegertoIntMax()replacetoUIntMax()

 func randomNumber<T : SignedInteger>(inRange range: ClosedRange<T> = 1...6) -> T { let length = (range.upperBound - range.lowerBound + 1).toIntMax() let value = arc4random().toIntMax() % length + range.lowerBound.toIntMax() return T(value) } 

斯威夫特4

由于在Swift 4中删除了toIntMax(),我们现在必须使用不同的方法转换成一个常用的整数types。 在这个例子中,我使用的Int64足够大,但是如果你使用的是无符号整数或者有一个Int128或者Int256自定义types,你应该使用这些。

 public func randomNumber<T : SignedInteger>(inRange range: ClosedRange<T> = 1...6) -> T { let length = Int64(range.upperBound - range.lowerBound + 1) let value = Int64(arc4random()) % length + Int64(range.lowerBound) return T(value) } 

另外,对于总的random-phile,这是一个扩展,它从任何Collectiontypes对象中返回一个随机元素。 注意这使用上面的函数来生成它的索引,所以你将需要两个。

 extension Collection { func randomItem() -> Self.Iterator.Element { let count = distance(from: startIndex, to: endIndex) let roll = randomNumber(inRange: 0...count-1) return self[index(startIndex, offsetBy: roll)] } } 

用法

 randomNumber() 

返回一个1到6之间的随机数。

 randomNumber(50...100) 

返回一个介于50和100之间的数字。 当然,你可以用你喜欢的任何东西replace50和100的值。

如果你想我创build的随机数字。 这是数字Int和Double,Float的扩展

 /** Arc Random for Double and Float */ public func arc4random <T: IntegerLiteralConvertible> (type: T.Type) -> T { var r: T = 0 arc4random_buf(&r, UInt(sizeof(T))) return r } public extension Int { /** Create a random num Int :param: lower number Int :param: upper number Int :return: random number Int By DaRkDOG */ public static func random (#lower: Int , upper: Int) -> Int { return lower + Int(arc4random_uniform(upper - lower + 1)) } } public extension Double { /** Create a random num Double :param: lower number Double :param: upper number Double :return: random number Double By DaRkDOG */ public static func random(#lower: Double, upper: Double) -> Double { let r = Double(arc4random(UInt64)) / Double(UInt64.max) return (r * (upper - lower)) + lower } } public extension Float { /** Create a random num Float :param: lower number Float :param: upper number Float :return: random number Float By DaRkDOG */ public static func random(#lower: Float, upper: Float) -> Float { let r = Float(arc4random(UInt32)) / Float(UInt32.max) return (r * (upper - lower)) + lower } } 

使用 :

 let randomNumDouble = Double.random(lower: 0.00, upper: 23.50) let randomNumInt = Int.random(lower: 56, upper: 992) let randomNumInt =Float.random(lower: 6.98, upper: 923.09) 

Swift 3:

 func randomNumber(range: ClosedRange<Int> = 1...6) -> Int { let min = range.lowerBound let max = range.upperBound return Int(arc4random_uniform(UInt32(1 + max - min))) + min } 

那是因为arc4random_uniform()定义如下:

 func arc4random_uniform(_: UInt32) -> UInt32 

它需要一个UInt32作为input,并吐出一个UInt32。 你正试图通过一系列的价值观。 arc4random_uniform给你一个随机数,介于0到和你传递它的数字之间(例外),所以如果你想find一个介于-50和50之间的随机数,如[-50, 50] arc4random_uniform(101) - 50 [-50, 50]你可以使用arc4random_uniform(101) - 50

迅速:

 var index = 1 + random() % 6 

我修改了@DaRk -_- D0G的答案,与Swift 2.0一起工作

 /** Arc Random for Double and Float */ public func arc4random <T: IntegerLiteralConvertible> (type: T.Type) -> T { var r: T = 0 arc4random_buf(&r, sizeof(T)) return r } public extension Int { /** Create a random num Int :param: lower number Int :param: upper number Int :return: random number Int By DaRkDOG */ public static func random (lower: Int , upper: Int) -> Int { return lower + Int(arc4random_uniform(UInt32(upper - lower + 1))) } } public extension Double { /** Create a random num Double :param: lower number Double :param: upper number Double :return: random number Double By DaRkDOG */ public static func random(lower: Double, upper: Double) -> Double { let r = Double(arc4random(UInt64)) / Double(UInt64.max) return (r * (upper - lower)) + lower } } public extension Float { /** Create a random num Float :param: lower number Float :param: upper number Float :return: random number Float By DaRkDOG */ public static func random(lower: Float, upper: Float) -> Float { let r = Float(arc4random(UInt32)) / Float(UInt32.max) return (r * (upper - lower)) + lower } } 

在迅速…

这是包容性的, random(1,2)调用random(1,2)将返回一个1或2,这也将使用负数。

  func random(min: Int, _ max: Int) -> Int { guard min < max else {return min} return Int(arc4random_uniform(UInt32(1 + max - min))) + min } 

答案只是1行代码:

 let randomNumber = arc4random_uniform(8999) + 1000 //for 4 digit random number let randomNumber = arc4random_uniform(899999999) + 100000000 //for 9 digit random number let randomNumber = arc4random_uniform(89) + 10 //for 2 digit random number let randomNumber = arc4random_uniform(899) + 100 //for 3 digit random number 

替代解决scheme是:

  func generateRandomNumber(numDigits: Int) -> Int{ var place = 1 var finalNumber = 0; var finanum = 0; for var i in 0 ..< numDigits { place *= 10 let randomNumber = arc4random_uniform(10) finalNumber += Int(randomNumber) * place finanum = finalNumber / 10 i += 1 } return finanum } 

虽然缺点是数字不能从0开始。

我成功地完成了使用下面的代码创build一个随机数:

 var coin = arc4random_uniform(2) + 1 

希望这可以帮助你。

Swift 3 Xcode Beta 5解决scheme。 基于特德面包车Gaalen答案。

 extension Int { static func random(range: Range<Int> ) -> Int { var offset = 0 if range.lowerBound < 0 // allow negative ranges { offset = Swift.abs(range.lowerBound) } let mini = UInt32(range.lowerBound + offset) let maxi = UInt32(range.upperBound + offset) return Int(mini + arc4random_uniform(maxi - mini)) - offset } } 

var rangeFromLimits = arc4random_uniform((UPPerBound – LOWerBound)+ 1))+ LOWerBound;