質問
私が集めることができるものから arc4random()
よりもはるかに優れた乱数を生成します rand()
しかし、私はそれをシードする方法を見たことがありません、そして 私はしたいと思います 使用するのと同じです srand()
. 。方法はありますか?
解決
それは、Arc4randomが行うように設計されていることではありません。ドキュメントが述べているように:
arc4random()
機能は、高品質の32ビットの疑似ランダム数を非常に迅速に提供します。arc4random()
で説明されているカーネルの強い乱数サブシステムから定期的にシードしますrandom(4)
.
とにかくエントロピー源から自分自身を再播種するので、手動でシードすることによって何も得られず、実際、そのような方法は存在しません。
他のヒント
実際にiOS 9でこれを行うことができます。
import GameKit
let source = GKARC4RandomSource(seed: "hello world".data(using: .utf8)!)
source.dropValues(1024)
source.nextInt() // <-- your number
ドキュメントによると:
ARC4ベースのランダムソースには、繰り返し可能な初期シーケンスがあります。難読化に使用する場合は、最初からn値を削除する必要があります。ここで、nは768を超える任意の数である必要があります。初期シーケンスがフラッシュされるようにします。
したがって、同じ種子データを使用している限り(明らかに使用せずに !
生産コード)と同じ数のドロップされた値で、同じ結果が得られます。
Swift 3では、私が使用しています srand48()
と drand48()
シードされた価値が必要なとき。私は自分のニーズのために十分に機能するように見えるこの機能を作成しました:
func seeded_rand(seed:Int, min:Double, max:Double) -> Int
{
srand48(seed)
return Int(round(drand48() * (max-min)) + min)
}
以下を使用して、Arc4randomにランダム性としてバイトシーケンスを追加できます。 arc4random_addrandom()
実際にそれをシードする必要はありません...それは最初の呼び出しにシードします。電話でドキュメントをご覧ください
man arc4random
あなたのシェルで。説明の下で関連する行は次のとおりです。
There is no need to call arc4random_stir() before using arc4random(),
since arc4random() automatically initializes itself.