RandomKit adalah kerangka kerja cepat yang membuat pembuatan data acak menjadi sederhana dan mudah.
| Cabang | Status |
|---|---|
master |
RandomKit mungkin juga kompatibel dengan FreeBSD, Android, dan Windows (di bawah Cygwin) tetapi belum diuji untuk platform tersebut.
Swift Package Manager adalah manajer ketergantungan terdesentralisasi untuk Swift.
Tambahkan proyek ke Package.swift Anda.
import PackageDescription
let package = Package (
name : " MyAwesomeProject " ,
dependencies : [
. Package ( url : " https://github.com/nvzqz/RandomKit.git " ,
majorVersion : 5 )
]
)Impor modul RandomKit.
import RandomKitCocoapods adalah manajer ketergantungan terpusat untuk Objective-C dan Swift. Buka di sini untuk mempelajari lebih lanjut.
Tambahkan proyek ke podfile Anda.
use_frameworks!
pod 'RandomKit' , '~> 5.2.3'Jika Anda ingin berada di tepi pendarahan, ganti baris terakhir dengan:
pod 'RandomKit' , :git => 'https://github.com/nvzqz/RandomKit.git' Jalankan pod install dan buka file .xcworkspace untuk meluncurkan XCODE.
Impor kerangka kerja RandomKit.
import RandomKitCarthage adalah manajer ketergantungan terdesentralisasi untuk Objective-C dan Swift.
Tambahkan proyek ke cartfile Anda.
github "nvzqz/RandomKit"
Jalankan carthage update dan ikuti langkah -langkah tambahan untuk menambahkan RandomKit ke proyek Anda.
Impor kerangka kerja RandomKit.
import RandomKit Berbagai komponen RandomKit dapat dengan mudah dibandingkan dengan menjalankan benchmark.sh .
./benchmark.sh [FLAGS] [PROTOCOLS] Gunakan bendera --help untuk informasi tentang cara menggunakannya.
Catatan: Jumlah default adalah 10000000, yang banyak jika menggunakan bendera --array . Ini dapat diubah dengan menyerahkan argumen menjadi --count atau -c .
Cobalah sendiri! Unduh repo dan buka 'randomKit.playground'.
Protokol RandomGenerator mendefinisikan metode dasar untuk menghasilkan nilai primitif dan mengacak buffer.
Semua jenis yang disediakan yang sesuai dengan RandomGenerator memiliki nilai default statis yang dapat dilewati sebagai argumen inout untuk fungsi generasi.
let value = Int . random ( using : & Xoroshiro . default ) ARC4Random
arc4random tidak diekspor dengan fondasi di Linux dan platform lainnya, mereka secara dinamis dimuat saat runtime. DeviceRandom
MersenneTwister
Xoroshiro
Xorshift
XorshiftStar
ChaCha
SeedableRandomGenerator adalah untuk jenis yang dapat diunggulkan dengan beberapa jenis Seed terkait.
Protokol RandomBytesGenerator adalah untuk jenis yang berspesialisasi dalam menghasilkan jenis tertentu yang mengisi sejumlah byte. Misalnya, MersenneTwister mengkhususkan diri dalam menghasilkan UInt64 sementara Xorshift menghasilkan nilai UInt32 .
Untuk program tunggal, aman untuk menggunakan instance generator global seperti Xoroshiro.default sebagai sumber keacakan.
Untuk program multi-threaded, instance thread-lokal harus digunakan. Hal ini memungkinkan utas yang berbeda untuk menggunakan generator acak mereka sendiri yang terpisah tanpa keadaan berubah bersama.
Dalam contoh berikut, randomGenerator unik untuk setiap utas.
let randomBytes = Xoroshiro . withThreadLocal { randomGenerator in
return [ UInt8 ] ( randomCount : 1000 , using : & randomGenerator )
}Generator thread-lokal ditangani pada saat keluar utas, jadi tidak perlu khawatir tentang pembersihan.
Disarankan untuk tidak menelepon withThreadLocal(_:) atau mendapatkan penunjuk threadLocal setiap waktu yang dibutuhkan. Mengambil instance thread-lokal yang dikeluarkan overhead yang dapat dihindari.
// Bad
let value = Int . random ( using : & Xoroshiro . threadLocal . pointee )
array . shuffle ( using : & Xoroshiro . threadLocal . pointee )
// Good
let threadLocal = Xoroshiro . threadLocal
let value = Int . random ( using : & threadLocal . pointee )
array . shuffle ( using : & threadLocal . pointee )
// Better
Xoroshiro . withThreadLocal { randomGenerator in
let value = Int . random ( using : & randomGenerator )
array . shuffle ( using : & randomGenerator )
}Sebagai jalan pintas, Anda bahkan dapat menerapkan fungsi secara langsung sebagai parameter.
let value = Xoroshiro . withThreadLocal ( Int . random ) Sebelum v4.4.0, keamanan utas dapat dicapai dengan instantiasi instance unggulan baru dari tipe RandomGenerator yang diberikan. Masalah dengan ini adalah bahwa penyemaian yang tidak perlu terjadi setiap kali. Dengan ini, generator diunggulkan sekali dan kemudian dapat digunakan kembali pada titik -titik selanjutnya.
Pintasan ke versi reseeding dari generator juga tersedia:
Xoroshiro . withThreadLocalReseeding {
...
}Yang jauh lebih baik daripada menulis:
ReseedingRandomGenerator . withThreadLocal ( createdWith : { Xoroshiro . reseeding } ) {
...
}RandomKit sangat berorientasi pada protokol, yang memberikan kemampuan untuk menjadi sangat fleksibel dan modular.
Protokol untuk jenis yang dapat menghasilkan nilai acak menggunakan RandomGenerator .
Protokol untuk jenis yang dapat menghasilkan nilai acak opsional dalam rentang menggunakan RandomGenerator .
Int . random ( in : 0 ..< 0 , using : & randomGenerator ) // nil Protokol untuk jenis yang dapat menghasilkan nilai acak dalam rentang tertutup menggunakan RandomGenerator .
Int . random ( in : - 100 ... 100 , using : & randomGenerator ) // -79Protokol untuk tipe yang dapat menghasilkan nilai acak dari nilai dasar ke nilai lain, tidak termasuk.
Nilai dasar untuk bilangan bulat adalah 0. Ini berarti bahwa memanggil random(to:using:) Pada nilai negatif akan menghasilkan nilai negatif acak atau nol sedangkan nilai positif akan menghasilkan nilai positif atau nol acak.
Jika value == randomBase , value akan dikembalikan untuk random(to:using:) .
Int . random ( to : 2 , using : & randomGenerator ) // Either 0 or 1
Int . random ( to : 0 , using : & randomGenerator ) // Always 0
Int . random ( to : 32 , using : & randomGenerator ) // 15
Int . random ( to : - 5 , using : & randomGenerator ) // -3Protokol untuk tipe yang dapat menghasilkan nilai acak dari nilai dasar melalui nilai lain, inklusif.
Aturan yang sama mengenai nilai dasar RandomToValue berlaku untuk RandomThroughValue .
Protokol untuk tipe yang contohnya dapat mengambil elemen acak.
[ " Bob " , " Cindy " , " May " , " Charles " , " Javier " ] . random ( using : & randomGenerator ) // "Charles"
" Hello " . characters . random ( using : & randomGenerator ) // "e" Beberapa jenis fondasi seperti NSArray sesuai dengan protokol ini.
Protokol untuk tipe yang instance dapat memiliki elemen acak yang diambil dari dalam Range<Index> .
[ 20 , 37 , 42 ] . random ( in : 1 ..< 3 , using : & randomGenerator ) // Either 37 or 42Protokol untuk jenis yang elemennya dapat dijalankan.
// Array
[ 1 , 2 , 3 , 4 , 5 ] . shuffled ( using : & randomGenerator ) // [3, 4, 1, 5, 2]
// Dictionary
[ " a " : 1 , " b " : 2 , " c " : 3 ] . shuffled ( using : & randomGenerator ) // ["a": 3, "b": 1, "c": 2] Rekan yang dapat berubah dari shuffled(using:) adalah shuffle(using:) .
Untuk kinerja pengocok Array yang lebih baik, pertimbangkan untuk mengocok di tempat dengan shuffle(using:) .
Mirip dengan Shuffleable , kecuali tidak ada elemen yang ada di posisi awalnya.
Semua tipe integer asli Swift sesuai dengan protokol Random- .
Fungsi random(using:) membuat bilangan bulat dari nilai apa pun. Akibatnya, nilai negatif dapat dihasilkan untuk bilangan bulat yang ditandatangani.
Int . random ( using : & randomGenerator ) // An Int within Int.min and Int.max
Int . random ( in : 10 ... 20 , using : & randomGenerator ) // An Int within 10 and 20 Untuk membuat integer yang ditandatangani positif, gunakan random(to:using:) atau random(through:using:) .
Int . random ( to : 1000 , using : & randomGenerator ) // 731
Int . random ( through : 10 , using : & randomGenerator ) // 4Integer yang ditandatangani dapat dibuat dari rentang apa pun, tanpa bahaya meluap.
Int . random ( in : ( . min + 1000 ) ... ( . max - 200 ) , using : & randomGenerator ) // 5698527899712144154 Menghasilkan nilai titik mengambang acak dari dalam kisaran atau 0.0...1.0 secara default.
Double . random ( using : & randomGenerator ) // 0.9813615573117475
Double . random ( in : - 10 ... 10 , using : & randomGenerator ) // -4.03042337718197
Float . random ( in : - 10 ... 10 , using : & randomGenerator ) // 5.167088
Float80 . random ( in : - 10 ... 10 , using : & randomGenerator ) // -3.63204542399198874 Semua tipe FloatingPoint juga dapat sesuai dengan RandomInClosedRange yang di luar kotak.
Bool.random(using:) memiliki peluang 50/50 untuk menjadi true .
Jika Anda membutuhkan probabilitas yang berbeda, ada juga random(withWeight:using:) , yang memiliki peluang weight 1 untuk menjadi true .
String , Character , dan UnicodeScalar menghasilkan nilai di dalam " "..."~" secara default.
String . random ( ofLength : 10 , using : & randomGenerator ) // "}+[=Ng>$w1"
String . random ( ofLength : 10 , in : " A " ... " z " , using : & randomGenerator ) // "poUtXJIbv["
Character . random ( using : & randomGenerator ) // "#"
Character . random ( in : " A " ... " z " , using : & randomGenerator ) // "s" Array nilai acak dapat dihasilkan untuk jenis yang sesuai dengan Random dengan init(randomCount:using:) .
Inisialisasi serupa ada untuk semua protokol Random- lainnya.
let randoms = Array < Int > ( randomCount : 100 , using : & randomGenerator ) // [8845477344689834233, -957454203475087100, ...] Untuk jenis yang sesuai dengan UnsafeRandom , alternatif yang lebih cepat adalah init(unsafeRandomCount:using:) . Inisialisasi ini mengisi buffer secara langsung daripada menggunakan random(using:) .
let unsafeRandoms = Array < Int > ( unsafeRandomCount : 100 , using : & randomGenerator ) // [759709806207883991, 4618491969012429761, ...] Benchmark menghasilkan 1000 array Int acak 10000 Count:
| Generator | Waktu (dalam hitungan detik) |
|---|---|
Xoroshiro | 0,0271 |
Xorshift | 0,0568 |
XorshiftStar | 0,0319 |
ChaCha | 0.2027 |
MersenneTwister | 0,0432 |
ARC4Random | 0.2416 |
DeviceRandom | 5.3348 |
Catatan: Hasil dapat bervariasi karena berbagai faktor.
Benchmark yang sama ini dapat dijalankan dengan:
./benchmark.sh --all-generators --array 10000 --count 1000 Date acak dapat dihasilkan antara dua Date atau nilai TimeInterval .
random(using:) Fungsi mengembalikan Date dalam Date.distantPast dan Date.distantFuture .
Date . random ( using : & randomGenerator ) // "Aug 28, 2006, 3:38 AM"
Date . random ( in : Date . distantPast ... Date ( ) , using : & randomGenerator ) // "Feb 7, 472, 5:40 AM" Jenis Decimal sesuai dengan berbagai protokol Random- .
Fungsi random(using:) Mengembalikan Decimal antara 0 dan 1 secara default.
Decimal . random ( using : & randomGenerator ) // 0.87490000409886706715888973957833129437
Decimal . random ( in : 0.0 ... 10.0 , using : & randomGenerator ) // 6.5464639772070720738747790627821299859 Angka acak dapat dihasilkan dari dalam bilangan bulat atau rentang ganda, atau 0...100 secara default.
NSNumber . random ( using : & randomGenerator ) // 79
NSNumber . random ( in : - 50 ... 100 , using : & randomGenerator ) // -27
NSNumber . random ( in : 100 ... 200 , using : & randomGenerator ) // 149.6156950363926Warna acak dapat dihasilkan, dengan atau tanpa alpha acak.
NSColor . random ( using : & randomGenerator ) // r 0.694 g 0.506 b 0.309 a 1.0
NSColor . random ( alpha : true , using : & randomGenerator ) // r 0.859 g 0.57 b 0.409 a 0.047
UIColor . random ( using : & randomGenerator ) // r 0.488 g 0.805 b 0.679 a 1.0
UIColor . random ( alpha : true , using : & randomGenerator ) // r 0.444 g 0.121 b 0.602 a 0.085 Karena CGFloat sesuai dengan FloatingPoint , itu sesuai dengan RandomInClosedRange seperti bagaimana Double dan Float Do.
CGFloat . random ( using : & randomGenerator ) // 0.699803650379181
CGFloat . random ( in : 0 ... 100 , using : & randomGenerator ) // 43.27969591675319Titik acak dapat dihasilkan dari dalam rentang untuk x dan y.
CGPoint . random ( using : & randomGenerator ) // {x 70.093 y 95.721}
CGPoint . random ( xRange : 0 ... 200 , yRange : 0 ... 10 , using : & randomGenerator ) // {x 73.795 y 0.991}Ukuran acak dapat dihasilkan dari dalam rentang untuk lebar dan tinggi.
CGSize . random ( using : & randomGenerator ) // {w 3.744 h 35.932}
CGSize . random ( widthRange : 0 ... 50 , heightRange : 0 ... 400 , using : & randomGenerator ) // {w 38.271 h 239.636}Persegi panjang acak dapat dihasilkan dari dalam rentang untuk x, y, lebar, dan tinggi.
CGRect . random ( using : & randomGenerator ) // {x 3.872 y 46.15 w 8.852 h 20.201}
CGRect . random ( xRange : 0 ... 50 ,
yRange : 0 ... 100 ,
widthRange : 0 ... 25 ,
heightRange : 0 ... 10 ,
using : & randomGenerator ) // {x 13.212 y 79.147 w 20.656 h 5.663}Vektor acak dapat dihasilkan dari dalam rentang untuk DX dan DY.
CGVector . random ( using : & randomGenerator ) // {dx 13.992 dy 89.376}
CGVector . random ( dxRange : 0 ... 50 , dyRange : 0 ... 10 , using : & randomGenerator ) // {dx 35.224 dy 13.463}Ekstensi RandomKit untuk Perpustakaan Bigint Károly tersedia di RandomKitBigint.
RandomKit dan asetnya dirilis di bawah lisensi MIT. Aset dapat ditemukan di cabang assets .
Bagian dari proyek ini menggunakan kode yang ditulis oleh Matt Gallagher dan, bersama dengan lisensi MIT, dilisensikan dengan yang ditemukan di sini.