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 )
]
)ランダムキットモジュールをインポートします。
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を起動します。
ランダムキットフレームワークをインポートします。
import RandomKitCarthageは、Objective-CおよびSwiftの分散型依存関係マネージャーです。
プロジェクトをカートファイルに追加します。
github "nvzqz/RandomKit"
carthage updateを実行し、追加の手順に従って、プロジェクトにランダムキットを追加します。
ランダムキットフレームワークをインポートします。
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 ) 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 )
}スレッドローカルジェネレーターは、スレッド出口で扱われるため、クリーンアップを心配する必要はありません。
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を使用してランダム値を生成できるタイプのプロトコル。
RandomGeneratorを使用して範囲内でオプションのランダム値を生成できるタイプのプロトコル。
Int . random ( in : 0 ..< 0 , using : & randomGenerator ) // nil RandomGeneratorを使用して、閉ル範囲内でランダム値を生成できるタイプのプロトコル。
Int . random ( in : - 100 ... 100 , using : & randomGenerator ) // -79ベース値から別の値、非包括的でランダム値を生成できるタイプのプロトコル。
整数の基本値は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に適用されます。
インスタンスがランダムな要素を取得できるタイプのプロトコル。
[ " 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 、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乱数は、整数または二重範囲内から、またはデフォルトで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árololyのBigint Library用のRandomKit拡張機能は、RandomKitbigintで利用できます。
RandomKitとその資産は、MITライセンスの下でリリースされます。資産はassets支店にあります。
このプロジェクトの一部は、Matt Gallagherによって書かれたコードを利用し、MITライセンスと併せて、ここで見つかったものとライセンスされています。