問題タブ [prng]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
191 参照

prng - 2 つの PRNG は、異なるシードで同じ数を生成できますか?

2 つの異なる PRNG で同じシードを使用すると、同じ一連の数字が返されることはわかっています。2 つの異なるシードで同じ数を生成できるかどうかは誰にもわかりませんか? もしそうなら、オッズは何ですか?

これについてテストを実行したところ、いくつかの奇妙な結果が得られました。同じ PRNG の 2 つのインスタンスがあり、毎回 2 つの異なるランダム シードでそれらをシードするとします。乱数は 0 から 1000 の間である必要があります。10,000,000 回の繰り返しの後、同じ数を 1046 回取得します。私がそれらを毎回シードしないと、ほぼ同じ回数 (1033) ほぼ同じ数を受け取ります。私は何を理解していませんか?毎回再シードしないと、確率がはるかに高くなると思います(うーん、そうではないかもしれません)。2 つのデッキから 2 枚のカードを選ぶのと同じです。毎回カードをシャッフルしないと、シャッフルした場合とはオッズが異なると思います。

ありがとう、ゲイリー

0 投票する
4 に答える
3891 参照

algorithm - パーリン/シンプレックス ノイズ アルゴリズムのランダム性の品質は?

パーリン ノイズ アルゴリズムとシンプレックス ノイズ アルゴリズムのランダム性の品質は?

2 つのアルゴリズムのどちらがランダム性に優れていますか?

標準の疑似乱数ジェネレーターと比較して、乱数ジェネレーターとして Perlin/Simplex を使用することは理にかなっていますか?

更新: パーリン/シンプレックス ノイズの用途はわかっています。私はランダム性のプロパティにのみ興味があります。

0 投票する
2 に答える
235 参照

algorithm - 引数に依存するPRNG

rand(x, y, seed)次のプロパティを使用して、引数に基づいて(疑似)乱数を返す関数に興味があります。

  1. 返される値は、その3つの引数に依存する必要があり、これまでに呼び出された回数には依存しません。randたとえば、これらの呼び出しをこの順序で想定します。

    次に、同じ引数を使用して呼び出しrandますが、順序は異なりますが、同じ値を取得する必要があります。例えば:

  2. 関数は、通常の適切なプロパティ(まともな、私は実際にはそれほど凝ったものは必要ありません)PRNGを持っている必要があります:大周期、一様分布など。符号付き整数に適合する正の整数を返すことは問題ありません。必要に応じて高くすることもできます。

  3. これらの数値が行列の生成に使用されると想定します。次に、シードを変更することで、生成されたマトリックスが他のシードによって生成されたマトリックスと可能な限り異なって見えるようにする必要があります。これは、できるだけ多くのシードで発生するはずです。行列を繰り返さないようにします。

それが役に立ったら、私のシードは常にミリ秒単位のUNIXタイムスタンプになります(それがどういうわけか簡単になる場合は秒単位でもかまいません)。すべての引数は32ビットのsignedintまで使用できますが、関数内で64ビット値を操作することは問題ありません。

これにはどのような機能を使用できますか?

私が考えたこと:

パーリンノイズは私が望むことのいくつかを実行しているように見えますが、PRNGとして、特に分布に関して、それが実際にどれほど適切であるかはわかりません。(x, y)また、パラメータがかなりランダムになり、すべてのパラメータを事前に計算できないため、どれほど効率的かわかりません。

次の関数も調べました。

これは十分な数を生成するようです。私の(非常に弱い)テストに基づくと、それらも非常によく分布しているようです。生理のテストはもっと難しいですが、私はそれをしていません。

アップデート:

上記の関数のEntの出力は次のとおりです。time(NULL)シードはCで、値は次のように生成され(x, y) in {0 ... 999} x {0 ... 999}ます。

エントロピー=バイトあたり3.312850ビット。

最適な圧縮により、この9207076バイトファイルのサイズが58%削減されます。

9207076サンプルのカイ2乗分布は、229710872.43であり、ランダムにこの値を超えるのは、0.01パーセント未満の時間です。

データバイトの算術平均値は52.3354(127.5 =ランダム)です。Piのモンテカルロ値は4.000000000(エラー27.32パーセント)です。シリアル相関係数は0.036131です(完全に無相関= 0.0)。

これは実際には十分に良いですか(理論的には、上記のテストはまったく良くないことを示唆しています)、または私が使用すべきよく知られているものがありますか?

0 投票する
1 に答える
3988 参照

c# - Int32 または UInt32 でビットをハッシュするための適切な方法は何ですか?

特にGeorge MarsagliaのXOR-Shift RNGの疑似乱数ジェネレーターの実装があります。私の実装はここにあります:

FastRandom.cs

最初のランダム サンプルはシードと非常に密接に相関していることがわかります。これは、Reinitialise(int シード) メソッドを見れば明らかです。これは悪いです。私が提案する解決策は、シードのビットを次のように混同することです。

そのため、シードのビットを 4 つの素数で乗算し、XOR 演算を行って _x を形成することにより、相関関係を大幅に弱めました。また、乗算の前にシードのビットをローテーションして、さまざまな大きさのビットが 32 ビット値の値の全範囲で混同されるようにします。

4 方向ローテーションは、何もしないことと可能なすべてのローテーション (32) の間のバランスが良いように見えました。素数は「空中の指」です。開始シードに関係なく、ビットをごちゃまぜにして32ビット全体に「広げる」のに十分な大きさとビット構造です。

より大きな素数を使用する必要がありますか? この問題に対する標準的なアプローチはありますか?おそらくより正式な根拠がありますか? 最小限の CPU オーバーヘッドでこれを実行しようとしています。

ありがとう

===更新===

32 ビットすべてに分散されたセット ビットを使用して、いくつかの素数を使用することにしました。その結果、乗算が同じ効果 (32 ビットの全範囲にわたってビットをハッシュする) を達成するため、シフトを省略できるので、最終的なシードを与えるために 4 つの積を追加するだけです...

素数/乗算を少なくすることでうまくいく可能性があります。2 つが少なすぎるように見え (最初のサンプルではまだパターンを確認できました)、3 つが問題ないように見えたので、安全マージンとして 4 つにしました。

=== 更新 2 ===

参考までに、上記は機能的に同等のものに縮小されます。

私は最初にこれを見つけませんでした。私が見つけたとき、計算のさまざまな段階でオーバーフローすると別の結果が生じるのではないかと思っていました。答えはノーだと思います - 2 つの計算は常に同じ答えを返します。

0 投票する
3 に答える
8067 参照

java - SHA-256でのSecureRandomの使用

シードされたSHA1PRNGアルゴリズムでSecureRandomを使用して、2つのプロセス間で共有ランダム性を作成しています。最近、SHA1がNISTの標準に従って非推奨になっていることを知り、SHA256への切り替えに取り組んでいます。私が発見した問題は、少なくともOracleのドキュメントによれば、SecureRandomはSHA1PRNGのみをサポートしているということです。SecureRandomをSHA256で使用する方法があるかどうか、またはおそらくもっと良い方法があるかどうか疑問に思っていましたが、SecureRandomを使用する代わりの適切な方法は何ですか?

0 投票する
5 に答える
37586 参照

glsl - この GLSL rand() ワンライナーの起源は何ですか?

Web のあちこちで参照されているシェーダーで使用するためのこの疑似乱数ジェネレーターを見てきました。

これは、「正規」または「どこかの Web で見つけたワンライナー」とさまざまに呼ばれます。

この機能の由来は何ですか?定数値は見た目ほど恣意的ですか、それとも選択に芸術性がありますか? この機能のメリットについての議論はありますか?

編集: 私が遭遇したこの関数への最も古い参照は、2008 年 2 月のこのアーカイブであり、元のページは現在 Web から削除されています。しかし、他のどこよりもそれについての議論はありません。

0 投票する
1 に答える
1237 参照

c# - 乱数ジェネレーターの駐車場テストを実装すると、悪い結果が生じるのはなぜですか?

乱数発生器の駐車場テストの実装を書こうとしています。テストに関する情報を入手しているソースは次のとおりです。Intel数学ライブラリのドキュメントこのペーパーの4ページ、およびここにリストされている確率密度のphi関数。

テストの実装をC#で作成しました。値が最初にnullに設定されている100x100グリッドを使用します。次に、乱数ジェネレーターを使用して、xとyのランダムな整数を生成します。グリッドとそのネイバーのインデックスが空の場合、そのインデックスは1に設定されます。それ以外の場合、「クラッシュ」が発生したため、何も起こりません。

C#System.Randomジェネレーターを使用して実行しました。私は常に3079ポイント近くに駐車しているので、結果が正しいとは思いません。これは、私が得ることになっている平均よりも約500ポイント少ないです。また、2.21829146215425E-90のp値が得られます。

私のコードは以下の通りです。誰かがこれについて何か経験がありますか、または誰かが私の実装で間違っているかもしれない何かを見ることができますか?どんな助けでも大歓迎です。

編集-私の元の実装の問題は

  • ディスクの代わりに正方形をプロットしていました
  • ポイントを整数値でプロットしただけです。代わりに10進数を使用する必要がありました。
  • 上記の2つの結果として、距離チェックを変更する必要がありました

これを理解するのを手伝ってくれたChrisSinclairとminezに感謝します。最終的なコードは以下に掲載されています。

0 投票する
2 に答える
2375 参照

montecarlo - .netでのモンテカルロシミュレーション用の信頼性が高く高速な疑似乱数ジェネレーター(PRNG)

疑似乱数ジェネレーター(PRNG)を使用して、モンテカルロがキューイングタイプのシステムをシミュレートします。System.Randomを使用します。これは高速であるためですが、後続の描画間に奇妙な相関関係があり、結果に干渉することがわかりました(十分にランダムではありません)。

現在、私はMersenne Twister(http://takel.jp/mt/MersenneTwister.cs)を使用しています。これは、(これまで)私の目的には十分にランダムであることが証明されています。それは50%遅いですが、それは信頼できる結果を得るために私が喜んで支払う代償です。

モンテカルロシミュレーションに最適な.netのPRNGはどれですか?遅すぎない信頼性の高いPRNGを探しています。

0 投票する
1 に答える
224 参照

c++ - Boostランダムインフラストラクチャを使用していますが、コンポーネントを簡単に置き換える方法(基礎となるジェネレーターなど)?

私の使用例は、たとえば、教室での使用です。

ブースト ランダム インフラストラクチャは既に存在し、NIH シンドロームを回避しようとしています。しかし、言ってみましょう、私はしたいです

1-さまざまなPRNGのプロパティ(OK、欠陥など)と、正規(または他の分布)変量の生成への影響​​を研究します。それを行う方法と、多数のディストリビューションを生成する他の Boost 機能を保持するにはどうすればよいですか?

2- Boot (Mersenne Twister など) ジェネレーターを使用し、他のディストリビューション (通常のディストリビューションなど) を生成するさまざまな方法をテストします。

Boost ランダム インフラストラクチャ コンポーネントのいずれかをドロップインで置き換え、残りを引き続き使用できるようにする簡単で一般的な方法はありますか?

0 投票する
3 に答える
1753 参照

python - ある種の「勢い」でランダムな方向(N、S、E、W、なし)を生成する方法は?

ランダムな方法でグリッドを探索しようとしています。
私が進むことができる 5 つの可能な方向は、北、東、南、西、および滞在であり、少なくとも最初のうちは、すべて同じ可能性があります。

上記からランダムな方向を選択するだけの問題は、エージェントが中心に近づきすぎてしまうことです (2 つのランダムな方向が互いに非常に簡単に打ち消し合う可能性があります)。これは、ランダム ウォークの目的を完全に無効にします。

私がやりたいことは、全体として偏りのないランダムな方法でランダムな方向を生成することですが、以前に選択した方向に近い方向を選択する可能性が高くなります

別の言い方をすれば、RNG にはある種の「勢い」が必要です。

私はこのアルゴリズムを思いつきました:

これは優れた結果をもたらすようです:

...ただし、このアルゴリズムは正の数と負の数の可能性が等しいことを保証しますが、-1 から +1 までの間隔で一様な分布を保証するわけではありません!

(数字が必ずしも -1 と +1 で区切られているわけではないことを理解していれば、これは明らかです!)

だから私の質問は、これ(または他のアルゴリズム)を、正または負の数だけでなく、5つの方向のいずれかを選択するように拡張するにはどうすればよいですか?