得到数组中的迅速随机元素 [英] Get random elements from array in swift

查看:137
本文介绍了得到数组中的迅速随机元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样一个数组:

var names: String = [ "Peter", "Steve", "Max", "Sandra", "Roman", "Julia" ]

我想从那个阵列3随机元素。我从C#来,但在迅疾我不确定从哪里开始。我想我应该先洗牌数组,然后挑弗里斯特3项从它的例子吗?

I would like to get 3 random elements from that array. I'm coming from C# but in swift I'm unsure where to start. I think I should shuffle the array first and then pick the frist 3 items from it for example?

我试着用下面的扩展洗牌吧:

I tried to shuffle it with the following extension:

extension Array
{
    mutating func shuffle()
    {
        for _ in 0..<10
        {
            sort { (_,_) in arc4random() < arc4random() }
        }
    }
}

但它说:'()'是无法转换为[INT]'在位置洗牌()。

but it then says "'()' is not convertible to '[Int]'" at the location of "shuffle()".

有关捡了一些元素使用:

For picking a number of elements i use:

var randomPicks = names[0..<4];

这看起来好为止。

which looks good so far.

有关如何洗牌任何想法?或者没有任何人有这更好/更优雅的解决方案?

Any ideas about how to shuffle? Or does anyone have a better/more elegant solution for this?

推荐答案

更​​新: X code 7•斯威夫特2.1

import UIKit
import Foundation

extension Array {
    var shuffle: [Element] {
        var elements = self
        for index in indices.dropLast() {
            guard
                case let swapIndex = Int(arc4random_uniform(UInt32(count - index))) + index
                where swapIndex != index else { continue }
            swap(&elements[index], &elements[swapIndex])
        }
        return elements
    }
    mutating func shuffled() {
        for index in indices.dropLast() {
            guard
                case let swapIndex = Int(arc4random_uniform(UInt32(count - index))) + index
                where swapIndex != index
                else { continue }
            swap(&self[index], &self[swapIndex])
        }
    }
    var chooseOne: Element {
        return self[Int(arc4random_uniform(UInt32(count)))]
    }
    func choose(n: Int) -> [Element] {
        return Array(shuffle.prefix(n))
    }
}

测试

var alphabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
let shuffledAlphabet = alphabet.shuffle

let letter = alphabet.chooseOne

var numbers = Array(0...9)

let shuffledNumbers = numbers.shuffle
shuffledNumbers                              // [8, 9, 3, 6, 0, 1, 4, 2, 5, 7]

numbers            // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

numbers.shuffled() // mutate it  [6, 0, 2, 3, 9, 1, 5, 7, 4, 8]

numbers            // [6, 0, 2, 3, 9, 1, 5, 7, 4, 8]

let pick3numbers = numbers.choose(3)  // [8, 9, 2]

这篇关于得到数组中的迅速随机元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆