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



мне нужно сгенерировать случайное число.



появляется больше не существует, а также

945   15  

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

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

обновление с помощью 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

    Ничего не найдено.