質問

私が集めることができるものから 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()

http://developer.apple.com/library/mac/#documentation/darwin/reference/manpages/man3/arc4random.3.html

実際にそれをシードする必要はありません...それは最初の呼び出しにシードします。電話でドキュメントをご覧ください

man arc4random

あなたのシェルで。説明の下で関連する行は次のとおりです。

There is no need to call arc4random_stir() before using arc4random(),
since arc4random() automatically initializes itself.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top