홈페이지>프로그래밍 관련>기타 소스코드

RandomKit은 랜덤 데이터 생성을 간단하고 쉽게 만드는 신속한 프레임 워크입니다.

상태 빌드 상태

나뭇가지 상태
master

설치

호환성

RandomKit은 FreeBSD, Android 및 Windows (Cygwin)와 호환되지만 해당 플랫폼에 대해 테스트되지 않았습니다.

Swift 패키지 관리자를 사용하여 설치하십시오

Swift Package Manager는 Swift의 분산 된 종속성 관리자입니다.

  1. Package.swift 에 프로젝트를 추가하십시오.

    import PackageDescription
    
    let package = Package (
        name : " MyAwesomeProject " ,
        dependencies : [
            . Package ( url : " https://github.com/nvzqz/RandomKit.git " ,
                     majorVersion : 5 )
        ]
    )
  2. RandomKit 모듈을 가져옵니다.

    import RandomKit

Cocoapods를 사용하여 설치하십시오

Cocoapods는 Objective-C 및 Swift의 중앙 집중식 종속성 관리자입니다. 자세히 알아 보려면 여기로 가십시오.

  1. Podfile에 프로젝트를 추가하십시오.

     use_frameworks!
    
    pod 'RandomKit' , '~> 5.2.3'

    출혈 가장자리에 있으려면 마지막 줄을 다음과 같이 교체하십시오.

     pod 'RandomKit' , :git => 'https://github.com/nvzqz/RandomKit.git'
  2. pod install 실행하고 .xcworkspace 파일을 열어 Xcode를 시작하십시오.

  3. RandomKit 프레임 워크를 가져옵니다.

    import RandomKit

Carthage를 사용하여 설치하십시오

Carthage는 Objective-C 및 Swift의 분산 형 의존 관리자입니다.

  1. 카트 파일에 프로젝트를 추가하십시오.

     github "nvzqz/RandomKit"
    
  2. carthage update 실행하고 추가 단계를 따라 프로젝트에 RandomKit을 추가하십시오.

  3. 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 ) 

사용 가능한 발전기

Seedablerandomgenerator

SeedableRandomGenerator 는 일부 관련 Seed 유형으로 시드 할 수있는 유형을위한 것입니다.

RandomBytesGenerator

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 사용하여 랜덤 값을 생성 할 수있는 유형에 대한 프로토콜.

RandomInRange

RandomGenerator 사용하여 범위 내에서 옵션 랜덤 값을 생성 할 수있는 유형에 대한 프로토콜.

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

randominclosedRange

RandomGenerator 사용하여 폐쇄 범위 내에서 랜덤 값을 생성 할 수있는 유형에 대한 프로토콜.

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

randomtovalue

기본 값에서 다른 값으로 무작위 값을 생성 할 수있는 유형에 대한 프로토콜, 비 포함.

정수의 기본 값은 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

Randomthroughvalue

다른 값을 통해 기본 값에서 임의 값을 생성 할 수있는 유형에 대한 프로토콜.

RandomToValue 의 기본 값에 관한 동일한 규칙이 RandomThroughValue 에 적용됩니다.

무작위 적응 가능

인스턴스에 임의의 요소를 검색 할 수있는 유형에 대한 프로토콜.

 [ " Bob " , " Cindy " , " May " , " Charles " , " Javier " ] . random ( using : & randomGenerator )  // "Charles"

" Hello " . characters . random ( using : & randomGenerator )  // "e"

NSArray 와 같은 일부 기초 유형은이 프로토콜을 준수합니다.

randomrereievableInRange

인스턴스가 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 , CharacterUnicodeScalar 기본적으로 " "..."~" 내에서 값을 생성합니다.

 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

nsnumber

임의의 숫자는 정수 또는 이중 범위 내에서 또는 기본적으로 0...100 에서 생성 될 수 있습니다.

 NSNumber . random ( using : & randomGenerator )                 // 79
NSNumber . random ( in : - 50 ... 100 , using : & randomGenerator )  // -27
NSNumber . random ( in : 100 ... 200 , using : & randomGenerator )  // 149.6156950363926

코코아 및 Uikit 유형

NSCOLOR 및 UICOLOR

임의의 색상은 임의의 알파 유무에 관계없이 생성 될 수 있습니다.

 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

Coregraphics 유형

cgfloat

CGFloat FloatingPoint 준수하기 때문에 DoubleFloat 어떻게하는지와 마찬가지로 RandomInClosedRange 를 준수합니다.

 CGFloat . random ( using : & randomGenerator )               // 0.699803650379181
CGFloat . random ( in : 0 ... 100 , using : & randomGenerator )  // 43.27969591675319

cgpoint

X 및 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

무작위 크기는 너비와 높이에 대한 범위 내에서 생성 될 수 있습니다.

 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

임의의 사각형은 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}

cgvector

랜덤 벡터는 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 라이센스와 함께 여기에있는 것과 함께 라이센스가 부여됩니다.

확장하다
추가 정보