RandomKit은 랜덤 데이터 생성을 간단하고 쉽게 만드는 신속한 프레임 워크입니다.
| 나뭇가지 | 상태 |
|---|---|
master |
RandomKit은 FreeBSD, Android 및 Windows (Cygwin)와 호환되지만 해당 플랫폼에 대해 테스트되지 않았습니다.
Swift Package Manager는 Swift의 분산 된 종속성 관리자입니다.
Package.swift 에 프로젝트를 추가하십시오.
import PackageDescription
let package = Package (
name : " MyAwesomeProject " ,
dependencies : [
. Package ( url : " https://github.com/nvzqz/RandomKit.git " ,
majorVersion : 5 )
]
)RandomKit 모듈을 가져옵니다.
import RandomKitCocoapods는 Objective-C 및 Swift의 중앙 집중식 종속성 관리자입니다. 자세히 알아 보려면 여기로 가십시오.
Podfile에 프로젝트를 추가하십시오.
use_frameworks!
pod 'RandomKit' , '~> 5.2.3'출혈 가장자리에 있으려면 마지막 줄을 다음과 같이 교체하십시오.
pod 'RandomKit' , :git => 'https://github.com/nvzqz/RandomKit.git' pod install 실행하고 .xcworkspace 파일을 열어 Xcode를 시작하십시오.
RandomKit 프레임 워크를 가져옵니다.
import RandomKitCarthage는 Objective-C 및 Swift의 분산 형 의존 관리자입니다.
카트 파일에 프로젝트를 추가하십시오.
github "nvzqz/RandomKit"
carthage update 실행하고 추가 단계를 따라 프로젝트에 RandomKit을 추가하십시오.
RandomKit 프레임 워크를 가져옵니다.
import RandomKit RandomKit의 다양한 구성 요소는 benchmark.sh 실행하여 쉽게 벤치마킹 할 수 있습니다.
./benchmark.sh [FLAGS] [PROTOCOLS] 사용 방법에 대한 정보는 --help 플래그를 사용하십시오.
참고 : 기본 수는 10000000이며 --array 플래그를 사용하는 경우 많은 것입니다. 인수를 --count 또는 -c 로 전달하여 변경할 수 있습니다.
직접 시도해보십시오! Repo를 다운로드하고 'RandomKit.Playground'를 열십시오.
RandomGenerator 프로토콜은 원시 값을 생성하고 버퍼를 무작위화하기위한 기본 방법을 정의합니다.
RandomGenerator 를 준수하는 모든 제공된 유형은 정적 default 을 가지고 있으며, 이는 생성 기능에 대한 inout 인수로 전달 될 수 있습니다.
let value = Int . random ( using : & Xoroshiro . default ) ARC4Random
arc4random 기능 제품군의 기호는 Linux 및 기타 플랫폼의 기초와 함께 내보내지 않기 때문에 런타임에 동적으로로드됩니다. DeviceRandom
MersenneTwister
Xoroshiro
Xorshift
XorshiftStar
ChaCha
SeedableRandomGenerator 는 일부 관련 Seed 유형으로 시드 할 수있는 유형을위한 것입니다.
RandomBytesGenerator 프로토콜은 여러 바이트를 채우는 특정 유형을 생성하는 유형을위한 것입니다. 예를 들어, MersenneTwister UInt64 생성하는 데 전문적이며 Xorshift UInt32 값을 생성합니다.
단일 스레드 프로그램의 경우 Xoroshiro.default 와 같은 글로벌 발전기 인스턴스를 임의성의 소스로 사용하는 것이 안전합니다.
다중 스레드 프로그램의 경우 스레드-로컬 인스턴스를 사용해야합니다. 이를 통해 다른 스레드는 공유 변동성 상태없이 자체 별도의 랜덤 생성기를 사용할 수 있습니다.
다음 예에서, randomGenerator 각 스레드마다 고유합니다.
let randomBytes = Xoroshiro . withThreadLocal { randomGenerator in
return [ UInt8 ] ( randomCount : 1000 , using : & randomGenerator )
}스레드 로컬 발전기는 스레드 출구시 거래되므로 정리에 대해 걱정할 필요가 없습니다.
threadLocal withThreadLocal(_:) 함께 호출하지 않는 것이 좋습니다. 스레드-로컬 인스턴스를 검색하면 피할 수있는 오버 헤드가 발생합니다.
// 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 )
}바로 가기로서, 당신은 매개 변수로 직접 함수를 적용 할 수도 있습니다.
let value = Xoroshiro . withThreadLocal ( Int . random ) v4.4.0 이전에, 주어진 RandomGenerator 유형의 새로운 시드 인스턴스를 인스턴스화함으로써 스레드 안전성을 달성 할 수 있습니다. 이것의 문제는 불필요한 시드가 매번 발생한다는 것입니다. 이를 통해 발전기는 한 번 시드 된 다음 이후 지점에서 재사용 할 수 있습니다.
생성기의 재조정 버전에 대한 바로 가기도 사용할 수 있습니다.
Xoroshiro . withThreadLocalReseeding {
...
}글쓰기보다 훨씬 낫습니다.
ReseedingRandomGenerator . withThreadLocal ( createdWith : { Xoroshiro . reseeding } ) {
...
}RandomKit은 매우 프로토콜 지향적이며 매우 유연하고 모듈 식 일 수 있습니다.
RandomGenerator 사용하여 랜덤 값을 생성 할 수있는 유형에 대한 프로토콜.
RandomGenerator 사용하여 범위 내에서 옵션 랜덤 값을 생성 할 수있는 유형에 대한 프로토콜.
Int . random ( in : 0 ..< 0 , using : & randomGenerator ) // nil RandomGenerator 사용하여 폐쇄 범위 내에서 랜덤 값을 생성 할 수있는 유형에 대한 프로토콜.
Int . random ( in : - 100 ... 100 , using : & randomGenerator ) // -79기본 값에서 다른 값으로 무작위 값을 생성 할 수있는 유형에 대한 프로토콜, 비 포함.
정수의 기본 값은 0입니다. 이것은 음수 값에서 random(to:using:) 호출하면 랜덤 음수 값 또는 0을 생성하는 반면 양수 값은 랜덤 양수 값 또는 0을 생성한다는 것을 의미합니다.
value == randomBase 인 경우, value 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다른 값을 통해 기본 값에서 임의 값을 생성 할 수있는 유형에 대한 프로토콜.
RandomToValue 의 기본 값에 관한 동일한 규칙이 RandomThroughValue 에 적용됩니다.
인스턴스에 임의의 요소를 검색 할 수있는 유형에 대한 프로토콜.
[ " Bob " , " Cindy " , " May " , " Charles " , " Javier " ] . random ( using : & randomGenerator ) // "Charles"
" Hello " . characters . random ( using : & randomGenerator ) // "e" NSArray 와 같은 일부 기초 유형은이 프로토콜을 준수합니다.
인스턴스가 Range<Index> 내에서 임의의 요소를 검색 할 수있는 유형에 대한 프로토콜.
[ 20 , 37 , 42 ] . random ( in : 1 ..< 3 , using : & randomGenerator ) // Either 37 or 42요소를 섞을 수있는 유형의 프로토콜.
// 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] shuffled(using:) 의 변이 가능한 상대는 shuffle(using:) 입니다.
더 나은 Array 셔플 링 성능을 보려면 shuffle(using:) .
초기 위치에있는 요소가없는 것을 제외하고는 Shuffleable 과 유사합니다.
Swift의 모든 기본 정수 유형은 Random- 프로토콜을 준수합니다.
random(using:) 함수는 모든 값의 정수를 만듭니다. 결과적으로, 음수 값은 서명 된 정수의 결과를 초래할 수 있습니다.
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 긍정적 인 서명 정수를 만들려면 random(to:using:) 또는 random(through:using:) 사용하십시오.
Int . random ( to : 1000 , using : & randomGenerator ) // 731
Int . random ( through : 10 , using : & randomGenerator ) // 4서명 된 정수는 오버플로의 위험없이 모든 범위에서 만들 수 있습니다.
Int . random ( in : ( . min + 1000 ) ... ( . max - 200 ) , using : & randomGenerator ) // 5698527899712144154 기본적으로 범위 내에서 또는 0.0...1.0 내에서 임의의 부동 소수점 값을 생성하십시오.
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 모든 FloatingPoint 유형은 또한 RandomInClosedRange 기본적으로 준수 할 수 있습니다.
Bool.random(using:) 는 50/50 확률이 true 입니다.
weight 확률이 필요한 경우, random(withWeight:using:) 도 있습니다 true
String , Character 및 UnicodeScalar 기본적으로 " "..."~" 내에서 값을 생성합니다.
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" init(randomCount:using:) 와의 Random 에 부합하는 유형에 대해 임의 값의 배열을 생성 할 수 있습니다.
다른 모든 Random- 프로토콜에 대해 유사한 초기화기가 존재합니다.
let randoms = Array < Int > ( randomCount : 100 , using : & randomGenerator ) // [8845477344689834233, -957454203475087100, ...] UnsafeRandom 준수하는 유형의 경우 더 빠른 대안이 init(unsafeRandomCount:using:) 입니다. 이 이니셜 라이저는 random(using:) .
let unsafeRandoms = Array < Int > ( unsafeRandomCount : 100 , using : & randomGenerator ) // [759709806207883991, 4618491969012429761, ...] 10000 카운트의 1000 랜덤 Int 배열을 생성하는 벤치 마크 :
| 발전기 | 시간 (몇 초) |
|---|---|
Xoroshiro | 0.0271 |
Xorshift | 0.0568 |
XorshiftStar | 0.0319 |
ChaCha | 0.2027 |
MersenneTwister | 0.0432 |
ARC4Random | 0.2416 |
DeviceRandom | 5.3348 |
참고 : 다양한 요인으로 인해 결과가 다를 수 있습니다.
이 동일한 벤치 마크는 다음과 함께 실행할 수 있습니다.
./benchmark.sh --all-generators --array 10000 --count 1000 두 Date 또는 TimeInterval 값 사이에 임의 Date 생성 될 수 있습니다.
기본 random(using:) 함수는 Date.distantPast 내에서 Date 반환합니다 .DistantPast 및 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" Decimal 유형은 다양한 Random- 프로토콜을 준수합니다.
random(using:) 함수는 기본적으로 0과 1 사이의 Decimal 반환합니다.
Decimal . random ( using : & randomGenerator ) // 0.87490000409886706715888973957833129437
Decimal . random ( in : 0.0 ... 10.0 , using : & randomGenerator ) // 6.5464639772070720738747790627821299859 임의의 숫자는 정수 또는 이중 범위 내에서 또는 기본적으로 0...100 에서 생성 될 수 있습니다.
NSNumber . random ( using : & randomGenerator ) // 79
NSNumber . random ( in : - 50 ... 100 , using : & randomGenerator ) // -27
NSNumber . random ( in : 100 ... 200 , using : & randomGenerator ) // 149.6156950363926임의의 색상은 임의의 알파 유무에 관계없이 생성 될 수 있습니다.
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 CGFloat FloatingPoint 준수하기 때문에 Double 과 Float 어떻게하는지와 마찬가지로 RandomInClosedRange 를 준수합니다.
CGFloat . random ( using : & randomGenerator ) // 0.699803650379181
CGFloat . random ( in : 0 ... 100 , using : & randomGenerator ) // 43.27969591675319X 및 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 . 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}임의의 사각형은 x, y, 너비 및 높이의 범위 내에서 생성 될 수 있습니다.
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}랜덤 벡터는 DX 및 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}Károly의 Bigint Library에 대한 Randomkit 확장은 RandomKitbigint에서 제공됩니다.
RandomKit과 그 자산은 MIT 라이센스에 따라 해제됩니다. 자산은 assets 지점에서 찾을 수 있습니다.
이 프로젝트의 일부는 Matt Gallagher가 작성한 코드를 사용하며 MIT 라이센스와 함께 여기에있는 것과 함께 라이센스가 부여됩니다.