私が収集できるものから、実際arc4random()
よりもはるかに優れた乱数を生成しますが、それをシードする方法を見たことがrand()
なく、. 方法はありますか?srand()
5 に答える
これは、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 より大きい任意の数にする必要があります。
したがって、同じシード データを使用し (明らかに!
、運用コードでは使用せずに)、同じ数のドロップされた値を使用する限り、同じ結果が得られます。
以下を使用して、arc4random にランダム性としてバイト シーケンスを追加できます。arc4random_addrandom()
実際にシードする必要はありません...最初の呼び出しでシードされます。電話してドキュメントを確認する
man arc4random
あなたのシェルで。説明の下の関連する行は次のとおりです。
There is no need to call arc4random_stir() before using arc4random(),
since arc4random() automatically initializes itself.