我需要生成一个随机数。
看起来arc4random
函数以及arc4random_uniform
函数都不存在了。
我的选择包括 arc4random_stir()
, arc4random_buf(UnsafeMutablePointer<Void>, Int)
, 和 arc4random_addrandom(UnsafeMutablePointer<UInt8>, Int32)
。
我找不到有关这些函数的文档,头文件中也没有注释提供提示。
我需要生成一个随机数。
看起来arc4random
函数以及arc4random_uniform
函数都不存在了。
我的选择包括 arc4random_stir()
, arc4random_buf(UnsafeMutablePointer<Void>, Int)
, 和 arc4random_addrandom(UnsafeMutablePointer<UInt8>, Int32)
。
我找不到有关这些函数的文档,头文件中也没有注释提供提示。
let randomIntFrom0To10 = Int.random(in: 1..<10)
let randomFloat = Float.random(in: 0..<1)
// if you want to get a random element in an array
let greetings = ["hey", "hi", "hello", "hola"]
greetings.randomElement()
Float.random()
is currently marked Beta, and so gives 'Float' has no member 'random'
- Dale你也可以尝试:
let diceRoll = Int(arc4random_uniform(UInt32(6)))
我不得不添加"UInt32"才能使它工作。
public func arc4random_uniform(_: UInt32) -> UInt32
。所以我想知道为什么要将参数转换为UInt32
?这里是否还发生了其他事情? - Mark Moeykens只需调用此函数并提供数字的最小和最大范围,即可获得随机数字。
例如,像 randomNumber(MIN: 0, MAX: 10) 这样,您将获得0到9之间的数字。
func randomNumber(MIN: Int, MAX: Int)-> Int{
return Int(arc4random_uniform(UInt32(MAX-MIN)) + UInt32(MIN));
}
func randomNumber(MIN: Int, MAX: Int) -> Int {
return Int(arc4random_uniform(UInt32(MAX - MIN)) + UInt32(MIN))
}
- Cortado-J使用 Swift 4.2 进行更新:
let randomInt = Int.random(in: 1..<5)
let randomFloat = Float.random(in: 1..<10)
let randomDouble = Double.random(in: 1...100)
let randomCGFloat = CGFloat.random(in: 1...1000)
经过一些调查,我写了以下内容:
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)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
}
urand64()
的函数,该函数从/dev/urandom
读取UInt64
,则可以像这样使用它:let rand = xorshift128plus(urand64(), urand64())
for _ in 1...10 {
print(rand())
}
我作为一个整数扩展的实现。将在范围 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))
}
}
import GameKit
let minValue = 0
let maxValue = 100
var randomDistribution: GKRandomDistribution?
let randomSource = GKMersenneTwisterRandomSource()
randomDistribution = GKRandomDistribution(randomSource: randomSource, lowestValue: minValue, highestValue: maxValue)
let number = randomDistribution?.nextInt() ?? 0
print(number)
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))")
let MAX : UInt32 = 9
let MIN : UInt32 = 1
func randomNumber()
{
var random_number = Int(arc4random_uniform(MAX) + MIN)
print ("random = ", random_number);
}