Предположим, у меня есть массив, и я хочу выбрать один элемент случайным образом.
Какой самый простой способ сделать это?
Очевидный путь был бы array[random index]
. Но, может быть, есть что-то вроде рубина array.sample
? Или, если нет, такой метод может быть создан с использованием расширения?
array[random number from 0 to length-1]
, но я не могу найти, как генерировать случайное int в swift, я бы спросил его о переполнении стека, если бы меня не заблокировали :) Я не хотел загрязнять вопрос половиной решений, когда, возможно, есть что-то вроде ruby'sarray.sample
Ответы:
Swift 4.2 и выше
Новый рекомендуемый подход является встроенным методом по протоколу сбора:
randomElement()
. Он возвращает необязательный параметр, чтобы избежать пустого регистра, который я предполагал ранее.Если вы не создаете массив и не уверены, что count> 0, вы должны сделать что-то вроде:
Swift 4.1 и ниже
Просто чтобы ответить на ваш вопрос, вы можете сделать это для достижения случайного выбора массива:
Кастинги безобразны, но я считаю, что они необходимы, если у кого-то еще нет другого пути.
источник
man arc4random
и stackoverflow.com/questions/10984974/…removeRandomElement()
функцию в дополнение кrandomElement()
. Он будет смоделированremoveFirst()
, но удалит объект со случайным индексом.0..<array.count
(по нескольким причинам, главным из которых является то, что он не работает для срезов и подвержен ошибкам). Вы можете сделатьlet randomIndex = array.indices.randomElement()
, а затемlet randomElement = array.remove(at: randomIndex)
. Вы могли бы даже вставить этоlet randomElement = array.remove(at: array.indices.randomElement())
.Следуя тому, что сказал Лукас, вы можете создать расширение для класса Array следующим образом:
Например:
источник
T
был переименован вElement
.guard
проверку, чтобы убедиться, что массив пуст, а затем вернутьсяnil
.arc4random
делает любой прирост производительности совершенно незначительным. Я обновил ответ.Версия Swift 4 :
источник
startIndex != 0
В Swift 2.2 это можно обобщить так, чтобы мы имели:
Во-первых, реализуем статическое
random
свойство дляUnsignedIntegerType
s:Тогда для
ClosedInterval
s сUnsignedIntegerType
оценками:Затем (немного больше) для
ClosedInterval
s сSignedIntegerType
границами (используя вспомогательные методы, описанные ниже):... где
unsignedDistanceTo
,unsignedDistanceFromMin
иplusMinIntMax
вспомогательные методы могут быть реализованы следующим образом :Наконец, для всех коллекций, где
Index.Distance == Int
:... который можно немного оптимизировать для целых чисел
Range
:источник
Вы также можете использовать встроенную функцию random () Swift для расширения:
источник
Еще одно предложение Swift 3
источник
После ответа других, но с поддержкой Swift 2.
Swift 1.x
Swift 2.x
Например:
источник
Альтернативная функциональная реализация с проверкой на пустой массив.
источник
Вот расширение для массивов с проверкой пустого массива для большей безопасности:
Вы можете использовать это так просто, как это :
Если вы предпочитаете Framework, в котором также есть несколько удобных функций, обратитесь к HandySwift . Вы можете добавить его в свой проект через Carthage, а затем использовать его точно так же, как в примере выше:
Кроме того, он также включает возможность получить несколько случайных элементов одновременно :
источник
Swift 3
импортировать GameKit
источник
Swift 3 - простой в использовании.
Создать массив
Создать случайный цвет
Установите этот цвет для вашего объекта
Вот пример из
SpriteKit
проекта, обновляющегоSKLabelNode
случайным образомString
:источник
Если вы хотите получить более одного случайного элемента из вашего массива без дубликатов , GameplayKit предоставит вам:
У вас есть пара вариантов случайности, смотрите GKRandomSource :
источник
Я считаю, что использование GameKit GKRandomSource.sharedRandom () работает лучше всего для меня.
или вы можете вернуть объект с выбранным случайным индексом. Убедитесь, что функция сначала возвращает строку, а затем возвращает индекс массива.
Коротко и точно.
источник
На данный момент есть встроенный метод
Collection
:Если вы хотите извлечь
n
из коллекции до случайных элементов, вы можете добавить такое расширение:И если вы хотите, чтобы они были уникальными, вы можете использовать a
Set
, но элементы коллекции должны соответствоватьHashable
протоколу:источник
Последний код swift3 попробуйте его нормально работает
источник
Я нашел совершенно другой способ сделать это, используя новые функции, представленные в Swift 4.2.
мы объявили функцию с параметрами, которая принимает массив строк и возвращает строку.
Затем мы берем ArrayOfStrings в переменной.
В основном это тасование массива строк, а также случайный выбор числа от общего числа отсчетов, а затем возврат случайного индекса перетасованного массива.
источник