ホーム>プログラミング関連>その他のソースコード

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. ランダムキットモジュールをインポートします。

    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. ランダムキットフレームワークをインポートします。

    import RandomKit

Carthageを使用してインストールします

Carthageは、Objective-CおよびSwiftの分散型依存関係マネージャーです。

  1. プロジェクトをカートファイルに追加します。

     github "nvzqz/RandomKit"
    
  2. carthage updateを実行し、追加の手順に従って、プロジェクトにランダムキットを追加します。

  3. ランダムキットフレームワークをインポートします。

    import RandomKit

ベンチマーク

ランダムキットのさまざまなコンポーネントは、 benchmark.sh実行することで簡単にベンチマークできます。

./benchmark.sh [FLAGS] [PROTOCOLS]

--helpフラグを使用して、使用方法に関する情報を使用してください。

注:デフォルトのカウントは10000000です。これは、 --arrayフラグを使用する場合に多くのことです。これは、引数を--countまたは-cに渡すことで変更できます。

使用法

自分で試してみてください!レポをダウンロードして、「randomkit.playground」を開きます。

ランダムゲネレーター

RandomGeneratorプロトコルは、プリミティブ値を生成し、バッファーをランダム化するための基本的な方法を定義します。

RandomGeneratorに準拠するすべての提供されたタイプには、生成関数に対するinout引数として渡すことができる静的なdefault値があります。

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

スレッドローカルジェネレーターは、スレッド出口で扱われるため、クリーンアップを心配する必要はありません。

withThreadLocal(_:)電話をかけないか、必要な個々の時間ごとにthreadLocalポインターを取得しないことをお勧めします。スレッドローカルインスタンスを取得すると、回避可能なオーバーヘッドが発生します。

// 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:)ランダムな負の値またはゼロが生成されるのに対し、正の値がランダムな正値またはゼロが得られることを意味します。

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に適用されます。

RandomRetRetRETREIVEABLE

インスタンスがランダムな要素を取得できるタイプのプロトコル。

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

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

NSArrayのようないくつかの基礎タイプは、このプロトコルに準拠しています。

randomretrretrivableinrange

インスタンスが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

文字列、文字、およびユニコデカラー

StringCharacter 、および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 、2つのDateまたはTimeInterval値の間で生成できます。

デフォルトの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}

余分な

bigint

KárololyのBigint Library用のRandomKit拡張機能は、RandomKitbigintで利用できます。

ライセンス

RandomKitとその資産は、MITライセンスの下でリリースされます。資産はassets支店にあります。

このプロジェクトの一部は、Matt Gallagherによって書かれたコードを利用し、MITライセンスと併せて、ここで見つかったものとライセンスされています。

拡大する
追加情報