Генерирование случайных чисел с помощью Swift
Мне нужно создать случайное число.
Похоже, функция arc4random
больше не существует, а также функция arc4random_uniform
.
У меня есть параметры arc4random_stir()
, arc4random_buf(UnsafeMutablePointer<Void>, Int)
и arc4random_addrandom(UnsafeMutablePointer<UInt8>, Int32)
.
Я не могу найти никаких документов о функциях, и никакие комментарии в файлах заголовков не дают подсказок.
Ответы
Ответ 1
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
, поскольку он избегает "модульного смещения", когда верхняя граница не является степенью двух.
Ответ 2
Вы также можете попробовать:
let diceRoll = Int(arc4random_uniform(UInt32(6)))
Мне пришлось добавить "UInt32", чтобы он работал.
Ответ 3
После некоторого исследования я написал следующее:
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)
Ответ 4
Просто вызовите эту функцию и укажите минимальный и максимальный диапазон числа, и вы получите случайное число.
eg.like randomNumber (MIN: 0, MAX: 10), и вы получите число от от 0 до 9.
func randomNumber(MIN: Int, MAX: Int)-> Int{
return Int(arc4random_uniform(UInt32(MAX)) + UInt32(MIN));
}
Примечание. - Вы всегда получите вывод целочисленного числа.
Ответ 5
Другой вариант - использовать алгоритм 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())
}
Ответ 6
let MAX : UInt32 = 9
let MIN : UInt32 = 1
func randomNumber()
{
var random_number = Int(arc4random_uniform(MAX) + MIN)
print ("random = ", random_number);
}
Ответ 7
вы можете использовать это с определенной скоростью:
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)))]
Ответ 8
В Swift 3:
Он будет генерировать случайное число от 0 до предела
let limit : UInt32 = 6
print("Random Number : \(arc4random_uniform(limit))")
Ответ 9
Позволяет использовать код с Swift для случайного числа или случайной строки:)
let quotes: NSArray = ["R", "A", "N", "D", "O", "M"]
let randomNumber = arc4random_uniform(UInt32(quotes.count))
let quoteString = quotes[Int(randomNumber)]
print(quoteString)
он выдаст вам случайный выход.
Ответ 10
Моя реализация как расширение 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))
}
}
Ответ 11
Не забывайте, что некоторые цифры будут повторяться! поэтому вам нужно сделать что-то вроде....
мои общие запросы были 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
}
Ответ 12
Вот как я получаю случайное число между 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))")
Ответ 13
Посмотри, у меня была такая же проблема, но я вставляю
функция как глобальная переменная
как
var RNumber = Int(arc4random_uniform(9)+1)
func GetCase(){
your code
}
очевидно, это неэффективно, поэтому я просто копирую и вставляю код в функцию, чтобы его можно было повторно использовать, тогда xcode предложит мне установить переменную как константу, чтобы мой код был
func GetCase() {
let RNumber = Int(arc4random_uniform(9)+1)
if categoria == 1 {
}
}
Ну, это часть моего кода, так что xcode скажет мне что-то о inmutable и инициализации, но все равно он создает приложение, и этот совет просто исчезает
надеюсь, что это поможет