MD5 / SHA256 / SHA512などをPRNGとして使用できますか?たとえば、整数シードが与えられた場合、擬似コードは次のようになります。
random_number = truncate_to_desired_range(
sha512( seed.toString() + ',' + i.toString() )
…まともなPRNG?(i
は増加する整数です。たとえば、出力は次のとおりです。
convert(sha512("<seed>,0"))
convert(sha512("<seed>,1"))
convert(sha512("<seed>,2"))
convert(sha512("<seed>,3"))
…
この質問の文脈では、「まともな」とは、出力の分散のみを指します。このように使用した場合、暗号化ハッシュ関数の出力は均一ですか?(ハッシュ関数に依存すると思いますが、すべての暗号化ハッシュも均一な出力を持つ必要がありますよね?)
注:暗号化ハッシュを使用しているため、これはメルセンヌツイスターと比較して遅いPRNGになることを認めます。私は速度には興味がなく、結果が安全であることに興味はありません。ただ、分布が正しいというだけです。
私の特定のユースケースでは、XKCDのジオハッシュに似たものを探しています。これは、分散したパーティによって簡単に実装され、全員が同じ答えに到達するという点です。Mersenne-Twisterは代用できますが、多くのターゲット言語ではあまり利用できません。(一部の言語には完全に欠けているものもあれば、生のU32出力にアクセスできないものもあります。SHA512は組み込みであるか、簡単に利用できます。)