タグ付けされた質問 「pseudo-random-generators」

ランダムシーケンスの確率的特性を持つ数のシーケンスを決定論的に生成するアルゴリズムに関する質問。

6
なぜ乱数ジェネレーターを結合しないのですか?
擬似乱数ジェネレーターが使用される多くのアプリケーションがあります。したがって、人々は、それが欠陥であると後で見つけるためだけに素晴らしいと思うものを実装します。最近、Javascript乱数ジェネレーターでこのようなことが起こりました。RandUもずっと以前です。ツイスターのようなもののための不適切な初期シードの問題もあります。 通常のxor演算子で2つ以上のジェネレーターファミリーを組み合わせた例は見つかりません。java.SecureRandomやTwister実装などを実行するのに十分なコンピューター能力がある場合、なぜ人々はそれらを結合しないのですか?ISAAC xor XORShift xor RandUはかなり良い例であり、単一のジェネレーターの弱点が他のジェネレーターによって緩和されていることがわかります。また、組み込みアルゴリズムはまったく異なるため、数値をより高い次元に分配するのにも役立ちます。それらを組み合わせてはならないという基本原則はありますか? 真の乱数ジェネレーターを構築する場合、2つ以上のエントロピーのソースを組み合わせることをお勧めします。私の例は違いますか? 同じファミリに属する​​複数の線形フィードバックシフトレジスタが連携して動作する一般的な例を除外しています。

3
メルセンヌツイスターはなぜ良いと見なされているのですか?
メルセンヌツイスターは広く良いとみなされています。ちなみに、CPythonのソースによると、「現存する最も広範囲にテストされたジェネレーターの1つです」しかし、これはどういう意味ですか?このジェネレーターのプロパティをリストするように求められたとき、私が提供できるもののほとんどは悪いです: それは大規模で柔軟性がありません(例:シークなしまたは複数のストリーム)。 巨大な状態サイズにもかかわらず、標準的な統計テストに失敗し、 0付近に重大な問題があり、ランダム化がかなり不十分であることを示唆しています。 速くない 等々。XorShift *のような単純なRNGと比較すると、それは絶望的にも複雑です。 それで、なぜこれが良いと考えられたのかについての情報を探しました。オリジナルの論文は、「超天文学」期間と623次元の均等分布について多くのコメントを述べています。 多くの既知の尺度の中で、スペクトルテスト(Knuth [1981]を参照)や以下に説明するk分布テストなど、より高い次元の均一性に基づくテストが最も強いと考えられています。 ただし、このプロパティの場合、ジェネレーターは十分な長さのカウンターで叩かれます!これは、ジェネレーターで実際に気にしているローカル分布の解説を行いません(ただし、「ローカル」はさまざまなことを意味します)。そして、CSPRNGでさえ、それほど重要ではないので、このような長い期間は気にしません。 論文には多くの数学がありますが、私が知る限り、実際にはランダム性の品質に関するものはほとんどありません。そのほとんどすべての言及は、これらの元々の、ほとんど役に立たない主張にすぐに戻ります。 古い、より信頼性の高い技術を犠牲にして、人々はこの時流に飛び乗ったようです。たとえば、LCGの単語数を3(Mersenne Twisterの「たった624」よりもはるかに少ない)に増やし、各パスで上位の単語を出力すると、BigCrush(TestU01テストスイートのより難しい部分)を通過します)、ツイスターが失敗したにもかかわらず(PCG論文、図2)。これと、メルセンヌツイスターを支持して見つけることができた弱い証拠を考えると、他の選択肢よりも注目を集めたのは何ですか? これも純粋に歴史的なものではありません。メルセンヌツイスターは、実際には、少なくともPCGランダムよりも実際に証明されていると言われています。しかし、ユースケースは私たちの一連のテストよりも優れているほど識別力がありますか?一部のグーグルは、おそらくそうではないと示唆しています。 要するに、メルセンヌツイスターは、その歴史的背景とその他の両方において、どのようにして広く肯定的な評判を得たのだろうかと思っています。一方で私は明らかにその性質に懐疑的ですが、他方では、それが完全にランダムに発生したことを想像するのは困難です。

7
PRNGを使用して魔法のように圧縮できますか?
この考えは、プログラミングを学び、最初にPRNGに出会った子供として私に思いつきました。どれほど現実的かはまだわかりませんが、今ではスタック交換があります。 これは驚くべき圧縮アルゴリズムのための14歳のスキームです: PRNG sを取得し、シードでシードして、疑似ランダムバイトの長いシーケンスを取得します。そのシーケンスを別のパーティに送信するには、PRNGの説明、適切なシード、およびメッセージの長さを伝えるだけです。十分に長いシーケンスの場合、その説明はシーケンス自体よりもはるかに短くなります。 ここで、プロセスを逆にできると仮定します。十分な時間と計算リソースがあれば、ブルートフォース検索を実行して、目的のシーケンスを生成するシード(およびPRNG、つまりプログラム)を見つけることができました(猫のいたずらの面白い写真を見てみましょう)。 PRNGは十分な数のビットが生成された後に繰り返されますが、「典型的な」サイクルと比較すると、私のメッセージは非常に短いので、これは問題のようには見えません。 Voila、データを圧縮する効果的な(ルーベゴールドバーグ式の場合)方法。 したがって、仮定: 圧縮したいシーケンスは有限であり、事前にわかっています。 現金も時間も不足していません(両方の有限量が必要である限り) 知りたい: スキームの背後にある推論に根本的な欠陥はありますか? この種の思考実験を分析する標準的な方法は何ですか? 概要 良い答えが答えを明らかにするだけでなく、私が本当に求めていたのは何であるかを明らかにすることはしばしばあります。皆の忍耐と詳細な回答に感謝します。 答えの要約に対する私のn回目の試みは次のとおりです。 PRNG /シード角度は何も寄与せず、目的のシーケンスを出力として生成するプログラムにすぎません。 ピジョンホールの原則:長さ<= kの(メッセージを生成する)プログラムよりも、長さ> kのメッセージが多くあります。そのため、一部のシーケンスは、メッセージよりも短いプログラムの出力にはなり得ません。 プログラム(メッセージ)のインタープリターが必ず事前に修正されていることに言及する価値があります。そして、その設計は、長さkのメッセージが受信されたときに生成できるメッセージの(小さな)サブセットを決定します。 この時点で、元のPRNGのアイデアはすでに消滅していますが、解決すべき最後の質問が少なくとも1つあります。 Q:幸運にも、長い(しかし有限の)メッセージがたまたま<kビットの長さのプログラムの出力であることがわかりますか? 厳密に言えば、可能性のあるすべてのメッセージ(プログラム)の意味を事前に知っておく必要があるため、偶然ではありません。それは <kビットのメッセージの意味であるかそうでないかです。 > = kビットのランダムメッセージをランダムに選択した場合(なぜですか?)、いずれの場合でも、kビット未満で送信できる確率はゼロになり、送信できないことはほぼ確実になります。使用するビット数はkビット未満です。 OTOH、kビット未満のプログラムの出力であるメッセージからkビット以上の特定のメッセージを選択すると(そのようなメッセージがあると仮定して)、実際にはすでに送信されたビットを利用していますレシーバー(インタープリターの設計)。転送されたメッセージの一部としてカウントされます。 最後に: Q:このエントロピー / コルモゴロフ複雑性ビジネスとは何ですか? 最終的に、両方とも、(より単純な)鳩の巣の原理が圧縮できる量について教えているのと同じことを教えてくれます:おそらくまったくない、おそらくいくつかですが、確かに私たちが空想するほどではありません(チートしない限り)。

2
N未満のランダムビットで2 ^ Nの1の確率をシミュレートする
次の離散分布をシミュレートする必要があるとします。 P(X=k)={12N,1−12N,if k=1if k=0P(X=k)={12N,if k=11−12N,if k=0 P(X = k) = \begin{cases} \frac{1}{2^N}, & \text{if $k = 1$} \\ 1 - \frac{1}{2^N}, & \text{if $k = 0$} \end{cases} 最も明白な方法は、NNNランダムビットを描画し、それらすべてが000(または111)に等しいかどうかをチェックすることです。しかし、情報理論は言う S=−∑iPilogPi=−12Nlog12N−(1−12N)log(1−12N)=12Nlog2N+(1−12N)log2N2N−1→0S=−∑iPilog⁡Pi=−12Nlog⁡12N−(1−12N)log⁡(1−12N)=12Nlog⁡2N+(1−12N)log⁡2N2N−1→0 \begin{align} S & = - \sum_{i} P_i \log{P_i} \\ & = - \frac{1}{2^N} \log{\frac{1}{2^N}} - \left(1 - \frac{1}{2^N}\right) \log{\left(1 - \frac{1}{2^N}\right)} …


1
線形フィードバックシフトレジスタのタップの選択
線形フィードバックシフトレジスタのタップの選択方法について混乱しています。 接続多項式 LFSRを示す図があります。5つのステージには、およびラベルが付けられており、タップはおよびから出ています。C(X)=X5+X2+1C(X)=X5+X2+1C(X) = X^5 + X^2 + 1R4,R3,R2,R1R4,R3,R2,R1R4, R3, R2, R1R0R0R0R0R0R0R3R3R3 これらのタップはどのように決定されますか?接続多項式が与えられているがダイアグラムが与えられていない場合、どの値をXORする必要があるかをどのようにして知ることができますか?

1
Nisan-Wigderson擬似乱数ジェネレーターのセキュリティの証明
ましょう、部分的である -designおよびはブール関数です。Nisan-WigdersonジェネレーターG_fは次のように定義されます。S={Si}1≤i≤nS={Si}1≤i≤n\cal{S}=\{S_i\}_{1\leq i\leq n}F :{ 0 、1 } M → { 0 、1 } G F:{ 0 、1 } L → { 0 、1 } nは(m,k)(m、k)(m,k)f:{0,1}m→{0,1}f:{0、1}m→{0、1}f: \{0,1\}^m \to \{0,1\}Gf:{0,1}l→{0,1}nGf:{0、1}l→{0、1}nG_f: \{0,1\}^l \to \{0,1\}^n Gf(x)=(f(x|S1),…,f(x|Sn))Gf(バツ)=(f(バツ|S1)、…、f(バツ|Sn))G_f(x) = (f(x|_{S_1}) , \ldots, f(x|_{S_n}) ) 計算するにはの番目のビット我々はビット取るでインデックス付きのしてから適用彼らに。G f x S i fi私iGfGfG_fxxxSiSiS_ifff 仮定あるサイズの回路の-hard定数です。がことを証明するにはどうすればよいですか?1fff nccGf(nc1nc1nc\frac{1}{n^c}ncncn^ccccGfGfG_f(nc2,2nc)(nc2,2nc)(\frac{n^c}{2}, \frac{2}{n^c}) 定義: 部分設計は、サブセット、S …

4
n個の設定ビットを持つ数値を正確に生成するためのPRNG
現在、バイナリデータを生成するコードを書いています。具体的には、指定されたビット数で64ビットの数値を生成する必要があります。より正確には、プロシージャはを取り、正確にビットがに設定され、残りが0に設定された擬似ランダム64ビット数を返す必要があります。0&lt;n&lt;640&lt;n&lt;640 < n < 64nnn111 私の現在のアプローチには、次のようなものが含まれます。 擬似乱数64ビット数を生成します。kkk のビットをカウントし、結果を保存します。kkkbbb 場合、出力します。それ以外の場合は1に進みます。b=nb=nb = nkkk これは機能しますが、洗練されていないようです。これよりもエレガントにセットビットの数を生成できるPRNGアルゴリズムの種類はありますか?nnn

4
ランダムDFAを生成するための適切なアルゴリズムは何ですか?
ランダムなDFAを生成して、DFA削減アルゴリズムをテストしています。 現在使用しているアルゴリズムは次のとおりです。各状態について、アルファベットcの各シンボルについて、ランダムな状態にδ (q 、c )を追加します。各状態は、最終状態になる確率が同じです。qqqcccδ(q、c )δ(q,c)\delta (q, c) これは、公平なDFAを生成する良い方法ですか?また、このアルゴリズムはトリムDFA(廃止された状態のないDFA)を生成しないので、ランダムなDFAを生成するより良い方法が何らかの方法で確実にトリムされているかどうか疑問に思いますか?

3
高品質の疑似ランダムジェネレーターは何ですか?
このSOの質問に対するこの回答を読む:なぜ乱数ジェネレーターを組み合わせないのですか?、それは話します 非常に高品質のPRNG(疑似乱数ジェネレーター) だから何が高品質のPRNGを構成するのか不思議に思いますが、「よりランダム」であるとまとめることができると思いますが、 質問1:PRNGのどの品質を使用して、「ランダム」または「良い」かを説明しますか? 質問2:「品質が悪い」PRNGがある場合、品質を向上させる方法はありますか?

1
連続した出力からPRNGの説明を復元する
疑似乱数ジェネレータの出力を考えて、タイプ(たとえば、線形フィードバックシフトレジスタ)、乗算付きキャリー、線形合同ジェネレータなど)をどのように決定し、関数とシードを回復できますか? 与えられた数の配列は確かにPRNGによって生成されます(暗号的に安全ではありません)。これは事前にわかっています。出力はクリーンで、PRNGは連続した数値を返すブラックボックスです(変更なし、スキップされた値なし)。次に、タスクは値から関数とシードを見つけることです。 単純なアイデアは、一致が見つかるまですべてのスキームを試すことですが、よりアルゴリズム的なアプローチに興味があります。

1
乱数ジェネレーターのシーケンスが1次元でのみ等分散されるとはどういう意味ですか?
上に読みながらXorshift I(強調は追加)以下に出くわしました: 次のxorshift +ジェネレーターは、代わりに128ビットの状態、最大周期2 ^ 128 − 1を持ち、BigCrushを渡します。 [snip code] このジェネレーターは、BigCrushを通過する最速のジェネレーターの1つです。ただし、これは1次元でのみ等分散されます。 この記事の前半には、次の内容があります。 [snip code] 両方のジェネレーターは、すべての最大周期のxorshift *ジェネレーターと同様に、可能な最大の次元で等分布された 64ビット値のシーケンスを出力します。 シーケンスが1つの次元で均等に分散されているのに対して、複数の次元で均等に分散されているとは、どういう意味ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.