Swift随机数问题

问题描述 投票:2回答:5

我正在使用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'

但是当我改变它时,它会出现更多的问题,而且似乎我继续围成一圈。

出了什么问题,我该如何解决这个问题?

xcode random swift arc4random
5个回答
5
投票

遇到类型问题时,请逐步构建表达式。

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,所以你需要到达那里。你不能在没有类型转换的情况下将FloatInt相乘,所以你需要添加它们。

当我说“逐步建立”时,我的意思是你,而不是编译器。编译器可以处理:

let randomMovement = Int(arc4random_uniform(UInt32(0.25 * Float(cs)) - UInt32(0.175 * Float(rd))) + UInt32(0.25 * Float(cs)))

但它有点难以理解(可能会计算两次cs / 4)。


3
投票

你可以在swift中使用内置的random()函数:

let randomInt = random() % 5

1
投票

在Swift 4.2中你可以做类似的东西:

let number = Int.random(in: 0 ..< 10)

0
投票

使用Swift 4.2,您现在可以直接从Int.random打电话。你可以看到更多细节here


-1
投票
let min  = a
let max = b

var x =  min + random_uniform(max - min)
© www.soinside.com 2019 - 2024. All rights reserved.