0

私が見つけることができるほとんどのランダム関数はシーケンス関数であり、最後に生成された結果を次の呼び出しのシードとして保持します

単独で実行でき、最初から最後までの任意の数とシードを指定すると、一見ランダムなシーケンスを与えることができる純粋な関数が必要です

正直に言うと、開始時のランダムシードと各要素のインデックスを入力としてのみ、アルゴリズムが乱数を並列に生成する (そして GPU で使用できる) ことを望んでいます

ハッシュ関数を使用できるかもしれませんが、シードと長さが与えられた場合、どのアルゴリズムが最も可能な均一な分布を提供し、常に一見ランダムに見えるかを知りたいです

編集:すべての提案に感謝します。自分が何を望んでいるかについて、説明できる確固たる考えを持っている

なだれ特性はあまり必要ありませんが、代わりに、均一な分布に関心があります。そして、それが並列であるためには、ステートレス アルゴリズムでなければならないため、ほとんどの PRNG は適合しません。

しかし、最も懸念されていないのはセキュリティです。人間の知覚による一見ランダムなシーケンスが必要ですが、視覚的およびインターフェイスのためだけに、セキュリティでは使用しません

それが非常に高速なアルゴリズムであれば、さらに感謝します

4

2 に答える 2

3

「純粋な」ランダム関数にはいくつかの選択肢があります。それらには以下が含まれます:

  • ハッシュ関数。
  • 疑似乱数ジェネレーター (PRNG) にその入力をシードし、その PRNG の出力を返す関数。
  • 内部状態を受け取り、乱数と新しい内部状態を出力する関数 (このアプローチは、Haskell やその他の関数型プログラミング言語に適しています)。

PRNG の設計に関する私の記事、または L'Ecuyer、Munger などによる記事「並列コンピューターの乱数: GPU に重点を置いた要件と方法」(2015) も参照してください。

どのハッシュ関数を使用するかについては、SHA-1、SHA-256、xxHash、MurmurHash3 など、さまざまな選択肢があります。セキュリティが必要かどうかなどの要因に応じて、他のハッシュ関数よりも適切なハッシュ関数がある場合があります。

ほとんどのハッシュ関数は一連のビットを出力しますが、それらを数値に変換する方法を理解するのは難しくありません。たとえば、この質問または0 と 1 で囲まれた数値に関する私の記事を参照してください。

于 2019-05-20T12:01:56.483 に答える