Beranda>Terkait pemrograman>Kode sumber lainnya

RandomKit adalah kerangka kerja cepat yang membuat pembuatan data acak menjadi sederhana dan mudah.

Bangun status

Cabang Status
master

Instalasi

Kesesuaian

RandomKit mungkin juga kompatibel dengan FreeBSD, Android, dan Windows (di bawah Cygwin) tetapi belum diuji untuk platform tersebut.

Instal Menggunakan Manajer Paket Swift

Swift Package Manager adalah manajer ketergantungan terdesentralisasi untuk Swift.

  1. Tambahkan proyek ke Package.swift Anda.

    import PackageDescription
    
    let package = Package (
        name : " MyAwesomeProject " ,
        dependencies : [
            . Package ( url : " https://github.com/nvzqz/RandomKit.git " ,
                     majorVersion : 5 )
        ]
    )
  2. Impor modul RandomKit.

    import RandomKit

Instal menggunakan cocoapods

Cocoapods adalah manajer ketergantungan terpusat untuk Objective-C dan Swift. Buka di sini untuk mempelajari lebih lanjut.

  1. 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'
  2. Jalankan pod install dan buka file .xcworkspace untuk meluncurkan XCODE.

  3. Impor kerangka kerja RandomKit.

    import RandomKit

Instal menggunakan Carthage

Carthage adalah manajer ketergantungan terdesentralisasi untuk Objective-C dan Swift.

  1. Tambahkan proyek ke cartfile Anda.

     github "nvzqz/RandomKit"
    
  2. Jalankan carthage update dan ikuti langkah -langkah tambahan untuk menambahkan RandomKit ke proyek Anda.

  3. Impor kerangka kerja RandomKit.

    import RandomKit

Benchmark

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 .

Penggunaan

Cobalah sendiri! Unduh repo dan buka 'randomKit.playground'.

RandomGenerator

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 ) 

Generator yang tersedia

Seedablerandomgenerator

SeedableRandomGenerator adalah untuk jenis yang dapat diunggulkan dengan beberapa jenis Seed terkait.

RandomByTesGenerator

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 .

Keamanan utas

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

Protokol

RandomKit sangat berorientasi pada protokol, yang memberikan kemampuan untuk menjadi sangat fleksibel dan modular.

Acak

Protokol untuk jenis yang dapat menghasilkan nilai acak menggunakan RandomGenerator .

Randominrange

Protokol untuk jenis yang dapat menghasilkan nilai acak opsional dalam rentang menggunakan RandomGenerator .

 Int . random ( in : 0 ..< 0 , using : & randomGenerator ) // nil

RandominclosedRange

Protokol untuk jenis yang dapat menghasilkan nilai acak dalam rentang tertutup menggunakan RandomGenerator .

 Int . random ( in : - 100 ... 100 , using : & randomGenerator ) // -79

Acak

Protokol 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 )  // -3

RandomThroughValue

Protokol untuk tipe yang dapat menghasilkan nilai acak dari nilai dasar melalui nilai lain, inklusif.

Aturan yang sama mengenai nilai dasar RandomToValue berlaku untuk RandomThroughValue .

Acak yang dapat direkam

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.

Acak randomioninrange

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 42

Mudah dikocok

Protokol 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:) .

Uniqueshufflable

Mirip dengan Shuffleable , kecuali tidak ada elemen yang ada di posisi awalnya.

Jenis cepat

Bilangan bulat

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 )  // 4

Integer yang ditandatangani dapat dibuat dari rentang apa pun, tanpa bahaya meluap.

 Int . random ( in : ( . min + 1000 ) ... ( . max - 200 ) , using : & randomGenerator )  // 5698527899712144154

Angka Titik Mengambang

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

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, karakter, dan unicodescalar

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

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 array

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

Jenis fondasi

Tanggal

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"

Desimal

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

Nsnumber

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.6156950363926

Jenis Kakao dan Uikit

Nscolor dan uicolor

Warna 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

Jenis Coregraphics

Cgfloat

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.27969591675319

CGPOint

Titik 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}

CGSize

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}

Cgrect

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}

CGVektor

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}

Tambahan

Bigint

Ekstensi RandomKit untuk Perpustakaan Bigint Károly tersedia di RandomKitBigint.

Lisensi

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.

Memperluas
Informasi Tambahan