我正在使用Swift和Xcode 6 Beta 5,并试图在我的特定约束之间生成一个随机数。
目前我正在使用arc4random_uniform()函数,它适用于简单生成,如:
arc4random_uniform(5)
但我试图创建一个带有复杂边界的随机数。这是我的尝试:
randomMovement = Int( arc4random_uniform( (0.25 * Int(cs)) - ( 0.175 * rd ) ) ) + Int( 0.175 * rd )
cs和rd都是整数 - 最初,cs = 100,rd = 40.这应该生成7到25之间的随机数。但是,由于变量类型,我在Xcode中遇到了很多问题。
使用此代码,它最初显示一个错误 - 在第一个'*'上,它表示:
'Int' is not convertible to 'UInt8'
但是当我改变它时,它会出现更多的问题,而且似乎我继续围成一圈。
出了什么问题,我该如何解决这个问题?
遇到类型问题时,请逐步构建表达式。
import Darwin
let cs = 100
let rd = 40
let min = UInt32(0.175 * Float(rd))
let max = UInt32(0.25 * Float(cs))
// This isn't really necessary, the next line will crash if it's not true, but
// just calling out this implicit assumption
assert(max >= min)
let randomMovement = Int(arc4random_uniform(max - min) + min)
arc4random_uniform
需要一个UInt32
,所以你需要到达那里。你不能在没有类型转换的情况下将Float
和Int
相乘,所以你需要添加它们。
当我说“逐步建立”时,我的意思是你,而不是编译器。编译器可以处理:
let randomMovement = Int(arc4random_uniform(UInt32(0.25 * Float(cs)) - UInt32(0.175 * Float(rd))) + UInt32(0.25 * Float(cs)))
但它有点难以理解(可能会计算两次cs / 4)。
你可以在swift中使用内置的random()函数:
let randomInt = random() % 5
在Swift 4.2中你可以做类似的东西:
let number = Int.random(in: 0 ..< 10)
使用Swift 4.2,您现在可以直接从Int.random
打电话。你可以看到更多细节here。
let min = a
let max = b
var x = min + random_uniform(max - min)