状態として 6 つの s を使用する素敵なプロパティを持つ疑似乱数ジェネレーター(PRNG) がありますUInt32
。私はそれをシードするための合理的な方法を考え出す必要があります。2 つの明白な可能性は次のとおりです。1) 6 つの乱数を生成しSystem.Random
、それらをシードとして使用します。2) で 2 つGUID
の を生成しGuid.NewGuid()
ます。どちらが良いでしょうか?
暗号化セキュリティは必要ありません。
状態として 6 つの s を使用する素敵なプロパティを持つ疑似乱数ジェネレーター(PRNG) がありますUInt32
。私はそれをシードするための合理的な方法を考え出す必要があります。2 つの明白な可能性は次のとおりです。1) 6 つの乱数を生成しSystem.Random
、それらをシードとして使用します。2) で 2 つGUID
の を生成しGuid.NewGuid()
ます。どちらが良いでしょうか?
暗号化セキュリティは必要ありません。
が必要な場合UInt32
は、Random
より便利ですか? Next()
、Next()
、Next()
など(およびキャスト)...(ただし、同じインスタンスを使用します-毎回Random
作成しないでください)。new Random()
これが十分なランダム性を提供するかどうかは、意図が何であるかによって異なります。これはただの種なので、大丈夫なはずです...
残念ながら System.Random() にもシード値が必要です。デフォルトでは、予測可能で実際にはランダムではない現在の Tick カウントを使用します。したがって、元の質問に戻る Random のシードが必要になります...
Guid.GetHashCode() をシードとして使用したことはありませんが、私の 2 秒の反応は、それは悪い考えのようには聞こえません。
暗号化セキュリティが必要かどうかに関係なく、System.Security.Cryptography.RNGCryptoServiceProvider を使用して乱数を生成してみませんか? 遅すぎるなどの特別な理由がない限り、使用しない理由がわかりません。これは暗号乱数ジェネレーターであるため、はるかに優れた乱数を取得でき、乱数のシードについて心配する必要はありません。
シード値としてこれを試してください...
(UInt32)Math.Pow(System.DateTime.Now.TimeOfDay.TotalMilliseconds, 11.0 / 7.0)
現在の時間のミリ秒を11/7乗するだけで、これは任意です。他の分数を試して、それらが自分に適しているかどうかを確認できます。
分数の小数に相当する値が約2.5より大きい場合、オーバーフローが発生し、シード値がゼロになる可能性があることに注意してください。:(
私はこれをしばらく使用しました、そしてそれはかなり良いシード値を与えるようです。