15 ответов:
===== Swift 4.2 / Xcode 10 =====
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()===== Swift 4.1 / Xcode 9 =====
arc4random()возвращает случайное число в диапазоне 0 до 4 294 967 295
drand48()возвращает случайное число в диапазоне 0.0 до 1.0
arc4random_uniform(N)возвращает случайное число в диапазоне 0 до N - 1примеры:
arc4random() // => UInt32 = 2739058784 arc4random() // => UInt32 = 2672503239 arc4random() // => UInt32 = 3990537167 arc4random() // => UInt32 = 2516511476 arc4random() // => UInt32 = 3959558840 drand48() // => Double = 0.88642843322303122 drand48() // => Double = 0.015582849408328769 drand48() // => Double = 0.58409022031727176 drand48() // => Double = 0.15936862653180484 drand48() // => Double = 0.38371587480719427 arc4random_uniform(3) // => UInt32 = 0 arc4random_uniform(3) // => UInt32 = 1 arc4random_uniform(3) // => UInt32 = 0 arc4random_uniform(3) // => UInt32 = 1 arc4random_uniform(3) // => UInt32 = 2arc4random_uniform () рекомендуется использовать конструкции типа
arc4random() % upper_boundпоскольку он избегает "смещения по модулю", когда верхняя граница не является степенью двух.
вы также можете попробовать:
let diceRoll = Int(arc4random_uniform(UInt32(6)))мне пришлось добавить "UInt32", чтобы заставить его работать.
просто вызовите эту функцию и укажите минимальный и максимальный диапазон чисел, и вы получите случайное число.
например.как randomNumber (MIN: 0, MAX: 10) и вы получите число между от 0 до 9.
func randomNumber(MIN: Int, MAX: Int)-> Int{ return Int(arc4random_uniform(UInt32(MAX-MIN)) + UInt32(MIN)); }Примечание: - Вы всегда будете получать выходное целое число.
после некоторого расследования я написал следующее:
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 тестов. Обратите внимание, что в то время как это высококачественный генератор псевдослучайных чисел с длительным периодом, это не криптографически безопасный генератор случайных чисел!--14-->.
вы можете засеять его из текущего времени или любого другого случайного источника энтропия. Например, если у вас есть функция с именем
urand64()чтениеUInt64С/dev/urandom, вы могли бы использовать его так: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); }
В Swift 3 :
Он будет генерировать случайное число от 0 до лимита
let limit : UInt32 = 6 print("Random Number : \(arc4random_uniform(limit))")
моя реализация как расширение Int. Будет генерировать случайные числа в диапазоне
from..<topublic 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)) } }
обновление с помощью 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)
вы можете использовать это в конкретных тариф:
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)))]
позволяет код с Swift для случайного числа или случайной строки :)
let quotes: NSArray = ["R", "A", "N", "D", "O", "M"] let randomNumber = arc4random_uniform(UInt32(quotes.count)) let quoteString = quotes[Int(randomNumber)] print(quoteString)это даст вам выход случайно.
Не забывайте, что некоторые числа будут повторяться! так что вам нужно сделать что-то вроде....
всего вопросов было 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 int!
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))")
другой вариант-использовать GKMersenneTwisterRandomSource из GameKit. Врачи говорят:
детерминированный псевдослучайный источник, генерирующий случайные числа основанный на алгоритме твистера Мерсенна. Это детерминированная случайность источник подходит для создания надежной игровой механики. Это немного медленнее, чем источник Arc4, но более случайный, поскольку он имеет более длительный период до повторения последовательностей. В то время как детерминированный, это не криптографический случайный источник. Однако он подходит для запутывание игровых данных.
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
Слушай, у меня была такая же проблема, но я вставлю функция как глобальная переменная
как
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 расскажет мне что-то о inmutable и инициализации, но он все равно построит приложение, и этот совет просто исчезни
надеюсь, что это помогает
Comments