使用 Swift 生成随机数
Generating random numbers with Swift
我需要生成一个随机数。
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()
你看,我遇到了同样的问题,但我插入了
作为全局变量的函数
作为
var RNumber = Int(arc4random_uniform(9)+1)
func GetCase(){
your code
}
显然这不是有效的,所以我只是将代码复制并粘贴到函数中以便它可以重复使用,然后 xcode 建议我将 var 设置为常量所以我的代码是
func GetCase() {
let RNumber = Int(arc4random_uniform(9)+1)
if categoria == 1 {
}
}
好吧,那是我代码的一部分,所以 xcode 告诉我一些不可变和初始化的东西,但是,它无论如何都会构建应用程序,而那个建议只是消失了
希望对您有所帮助
你也可以试试:
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)
另一种选择是使用 xorshift128plus 算法:
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
}
该算法的周期为 2^128 - 1,并通过了 BigCrush 测试套件的所有测试。请注意,虽然这是一个高质量的长周期伪随机数生成器,它不是加密安全的随机数生成器。
您可以从当前时间或任何其他随机熵源播种。例如,如果您有一个名为 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)))]
只需调用此函数并提供数字的最小和最大范围,您将获得一个随机数。
eg.like randomNumber(MIN: 0, MAX: 10) 你会得到 0 到 9 之间的数字。
func randomNumber(MIN: Int, MAX: Int)-> Int{
return Int(arc4random_uniform(UInt32(MAX-MIN)) + UInt32(MIN));
}
注意:- 你总是会输出一个整数。
在 Swift 3 中:
生成0到limit之间的随机数
let limit : UInt32 = 6
print("Random Number : \(arc4random_uniform(limit))")
让代码用 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 个整数之间的随机数!
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))")
更新 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)
另一种选择是使用 GameKit 中的 GKMersenneTwisterRandomSource。文档说:
A deterministic pseudo-random source that generates random numbers
based on a mersenne twister algorithm. This is a deterministic random
source suitable for creating reliable gameplay mechanics. It is
slightly slower than an Arc4 source, but more random, in that it has a
longer period until repeating sequences. While deterministic, this is
not a cryptographic random source. It is however suitable for
obfuscation of gameplay data.
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)
示例取自 Apple 的示例代码:https://github.com/carekit-apple/CareKit/blob/master/CareKitPrototypingTool/OCKPrototyper/CareKitPatient/RandomNumberGeneratorHelper.swift
我迟到了
使用允许您动态更改数组大小和范围选择的函数是最通用的方法。您也可以使用 map 这样非常简洁。我在所有表演中都使用它 testing/bench 标记。
elements
是数组中的项目数
仅包括来自 0...max
的数字
func randArr(_ elements: Int, _ max: Int) -> [Int] {
return (0..<elements).map{ _ in Int.random(in: 0...max) }
}
代码感觉/占位符看起来像这样。
randArr(elements: Int, max: Int)
我的数组中有 10 个元素,范围从 0 到 1000。
randArr(10, 1000) // [554, 8, 54, 87, 10, 33, 349, 888, 2, 77]
我需要生成一个随机数。
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()
你看,我遇到了同样的问题,但我插入了 作为全局变量的函数
作为
var RNumber = Int(arc4random_uniform(9)+1)
func GetCase(){
your code
}
显然这不是有效的,所以我只是将代码复制并粘贴到函数中以便它可以重复使用,然后 xcode 建议我将 var 设置为常量所以我的代码是
func GetCase() {
let RNumber = Int(arc4random_uniform(9)+1)
if categoria == 1 {
}
}
好吧,那是我代码的一部分,所以 xcode 告诉我一些不可变和初始化的东西,但是,它无论如何都会构建应用程序,而那个建议只是消失了
希望对您有所帮助
你也可以试试:
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)
另一种选择是使用 xorshift128plus 算法:
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
}
该算法的周期为 2^128 - 1,并通过了 BigCrush 测试套件的所有测试。请注意,虽然这是一个高质量的长周期伪随机数生成器,它不是加密安全的随机数生成器。
您可以从当前时间或任何其他随机熵源播种。例如,如果您有一个名为 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)))]
只需调用此函数并提供数字的最小和最大范围,您将获得一个随机数。
eg.like randomNumber(MIN: 0, MAX: 10) 你会得到 0 到 9 之间的数字。
func randomNumber(MIN: Int, MAX: Int)-> Int{
return Int(arc4random_uniform(UInt32(MAX-MIN)) + UInt32(MIN));
}
注意:- 你总是会输出一个整数。
在 Swift 3 中:
生成0到limit之间的随机数
let limit : UInt32 = 6
print("Random Number : \(arc4random_uniform(limit))")
让代码用 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 个整数之间的随机数!
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))")
更新 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)
另一种选择是使用 GameKit 中的 GKMersenneTwisterRandomSource。文档说:
A deterministic pseudo-random source that generates random numbers based on a mersenne twister algorithm. This is a deterministic random source suitable for creating reliable gameplay mechanics. It is slightly slower than an Arc4 source, but more random, in that it has a longer period until repeating sequences. While deterministic, this is not a cryptographic random source. It is however suitable for obfuscation of gameplay data.
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)
示例取自 Apple 的示例代码:https://github.com/carekit-apple/CareKit/blob/master/CareKitPrototypingTool/OCKPrototyper/CareKitPatient/RandomNumberGeneratorHelper.swift
我迟到了
使用允许您动态更改数组大小和范围选择的函数是最通用的方法。您也可以使用 map 这样非常简洁。我在所有表演中都使用它 testing/bench 标记。
elements
是数组中的项目数
仅包括来自 0...max
func randArr(_ elements: Int, _ max: Int) -> [Int] {
return (0..<elements).map{ _ in Int.random(in: 0...max) }
}
代码感觉/占位符看起来像这样。
randArr(elements: Int, max: Int)
我的数组中有 10 个元素,范围从 0 到 1000。
randArr(10, 1000) // [554, 8, 54, 87, 10, 33, 349, 888, 2, 77]