Misalkan saya memiliki array dan saya ingin memilih satu elemen secara acak.
Apa cara paling sederhana untuk melakukan ini?
Cara yang jelas akan terjadi array[random index]
. Tapi mungkin ada sesuatu seperti ruby array.sample
? Atau jika tidak dapatkah metode seperti itu dibuat dengan menggunakan ekstensi?
array[random number from 0 to length-1]
, tetapi saya tidak dapat menemukan cara menghasilkan int acak dalam cepat, saya akan menanyakannya pada stack overflow jika saya tidak diblokir :) Saya tidak ingin mencemari pertanyaan dengan setengah solusi ketika mungkin ada sesuatu seperti rubyarray.sample
Jawaban:
Cepat 4.2 dan lebih tinggi
Pendekatan baru yang disarankan adalah built-in metode pada protokol Koleksi:
randomElement()
. Ini mengembalikan opsional untuk menghindari kasus kosong yang saya duga sebelumnya.Jika Anda tidak membuat array dan tidak dijamin jumlah> 0, Anda harus melakukan sesuatu seperti:
Cepat 4.1 dan di bawah
Hanya untuk menjawab pertanyaan Anda, Anda dapat melakukan ini untuk mencapai pemilihan array acak:
Pengecorannya jelek, tapi saya yakin itu diperlukan kecuali ada orang lain yang punya cara lain.
sumber
man arc4random
dan stackoverflow.com/questions/10984974/...removeRandomElement()
fungsi selainrandomElement()
. Itu akan dimodelkanremoveFirst()
, tetapi menghapus objek pada indeks acak.0..<array.count
(karena berbagai alasan, yang utama adalah itu tidak bekerja untuk irisan, dan rentan kesalahannya). Anda bisa melakukannyalet randomIndex = array.indices.randomElement()
, diikuti olehlet randomElement = array.remove(at: randomIndex)
. Anda bahkan dapat mengikutinyalet randomElement = array.remove(at: array.indices.randomElement())
.Mengetahui apa yang dikatakan Lucas, Anda bisa membuat ekstensi ke kelas Array seperti ini:
Sebagai contoh:
sumber
T
telah diubah namanya menjadiElement
.guard
pemeriksaan untuk melihat apakah array kosong lalu kembalinil
.arc4random
membuat setiap keuntungan kinerja sama sekali tidak signifikan. Saya sudah memperbarui jawabannya.Versi Swift 4 :
sumber
startIndex != 0
Di Swift 2.2 ini dapat digeneralisasi sehingga kita memiliki:
Pertama, menerapkan
random
properti statis untukUnsignedIntegerType
s:Lalu, untuk
ClosedInterval
s denganUnsignedIntegerType
batasan:Kemudian (sedikit lebih terlibat), untuk
ClosedInterval
s denganSignedIntegerType
batasan (menggunakan metode pembantu dijelaskan lebih lanjut di bawah):... di mana
unsignedDistanceTo
,unsignedDistanceFromMin
danplusMinIntMax
metode pembantu dapat diimplementasikan sebagai berikut:Akhirnya, untuk semua koleksi di mana
Index.Distance == Int
:... yang dapat dioptimalkan sedikit untuk integer
Range
s:sumber
Anda dapat menggunakan fungsi acak () bawaan Swift juga untuk ekstensi:
sumber
Saran Swift 3 lainnya
sumber
Mengikuti orang lain menjawab tetapi dengan dukungan Swift 2.
Swift 1.x
Swift 2.x
Misalnya:
sumber
Implementasi fungsional alternatif dengan memeriksa array kosong.
sumber
Berikut ini ekstensi pada Array dengan pemeriksaan array kosong untuk keamanan lebih lanjut:
Anda dapat menggunakannya sesederhana ini :
Jika Anda lebih suka Kerangka yang juga memiliki beberapa fitur yang lebih berguna maka checkout HandySwift . Anda dapat menambahkannya ke proyek Anda melalui Kartago kemudian menggunakannya persis seperti pada contoh di atas:
Selain itu juga termasuk opsi untuk mendapatkan beberapa elemen acak sekaligus :
sumber
Cepat 3
impor GameKit
sumber
Swift 3 - sederhana mudah digunakan.
Buat Array
Buat Warna Acak
Atur warna itu ke objek Anda
Berikut adalah contoh dari
SpriteKit
proyek yang memperbaruiSKLabelNode
dengan acakString
:sumber
Jika Anda ingin bisa mendapatkan lebih dari satu elemen acak dari array Anda tanpa duplikat , GameplayKit telah Anda liput:
Anda memiliki beberapa pilihan untuk keacakan, lihat GKRandomSource :
sumber
Saya menemukan menggunakan GKRandomSource.shareRandom () GameKit yang terbaik untuk saya.
atau Anda bisa mengembalikan objek pada indeks acak yang dipilih. Pastikan fungsi mengembalikan sebuah String terlebih dahulu, dan kemudian mengembalikan indeks array.
Singkat dan langsung ke inti nya.
sumber
Ada metode bawaan
Collection
sekarang:Jika Anda ingin mengekstrak hingga
n
elemen acak dari koleksi, Anda dapat menambahkan ekstensi seperti ini:Dan jika Anda ingin mereka menjadi unik, Anda dapat menggunakan a
Set
, tetapi elemen koleksi harus sesuai denganHashable
protokol:sumber
Kode swift3 terbaru mencobanya berfungsi dengan baik
sumber
Saya menemukan cara yang sangat berbeda untuk melakukannya dengan menggunakan fitur-fitur baru yang diperkenalkan di Swift 4.2.
kami mendeklarasikan fungsi dengan parameter mengambil array dari Strings dan mengembalikan sebuah String.
Kemudian kita mengambil ArrayOfStrings dalam sebuah variabel.
Ini pada dasarnya mengocok array string dan kemudian juga memiliki pilihan acak dari jumlah total jumlah dan kemudian mengembalikan indeks acak dari array yang dikocok.
sumber