Генерирование случайных чисел с помощью 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 и инициализации, но все равно он создает приложение, и этот совет просто исчезает

надеюсь, что это поможет