Генерирование случайных чисел с помощью Swift

Мне нужно создать случайное число.

Похоже, функция arc4random больше не существует, а также функция arc4random_uniform .

У меня есть параметры arc4random_stir() , arc4random_buf(UnsafeMutablePointer, Int) и arc4random_addrandom(UnsafeMutablePointer, Int32) .

Я не могу найти никаких документов о функциях, и никакие комментарии в файлах заголовков не дают подсказок.

===== 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 = 2 

arc4random_uniform () рекомендуется использовать для таких конструкций, как arc4random() % upper_bound поскольку он избегает « 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 . Обратите внимание, что хотя это высококачественный генератор псевдослучайных чисел с длительным периодом, он не является криптографически защищенным генератором случайных чисел .

Вы могли бы высевать его из текущего времени или любого другого случайного источника энтропии. Например, если у вас есть функция 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..

 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)) } } 

Обновление с быстрым 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. Документы говорят:

Детерминированный псевдослучайный источник, который генерирует случайные числа, основанные на алгоритме mersenne twister. Это детерминированный случайный источник, подходящий для создания надежной механики геймплея. Он немного медленнее, чем источник 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 расскажет мне что-то о неспособном и инициализации, но все равно он создает приложение, и этот совет просто исчезает

Надеюсь, поможет

  • Swift Playground - Файлы недоступны для чтения
  • Как добавить ограничения программно с помощью Swift
  • Есть ли способ создать строку из массива utf16 в swift?
  • Массивы декодирования Swift JSONDecode терпят неудачу, если сбой одного элемента
  • Быстрые расширения протоколов
  • Что такое ошибка связи: OS_xpc_error в Xcode 6?
  • Параметры «var» устарели и будут удалены в Swift 3
  • Заголовок Swift для Objective-C, не созданный в Xcode 6
  • Xcode 8 / Swift 3: простой код UIPicker не работает
  • Как использовать пользовательские ключи с протоколом Swift 4 Decodable?
  • Быстрые константы: Struct или Enum
  • Давайте будем гением компьютера.