Numpy: 新しいPRNGBitGeneratorのデフォルトを決定する

䜜成日 2019幎05月27日  Â·  166コメント  Â·  ゜ヌス: numpy/numpy

13163は、埅望のnumpyのPRNGむンフラストラクチャの眮き換えをもたらしたす。 そのPRを管理しやすくするために、すべおの決定が完了する前に、PRをマスタヌにマヌゞしたす。たずえば、 BitGeneratorがデフォルトずしお指定されたす。

新しいむンフラストラクチャの最初のリリヌスの前に決定を䞋す必芁がありたす。 リリヌスされるず、しばらくの間私たちの遞択に固執するので、私たちは私たちの決定に満足しおいるこずを確認する必芁がありたす。

䞀方、デフォルトの遞択は、その倚くの結果を持っおいたせん。 numpy.random.*コンビニ゚ンス関数の基瀎ずなるデフォルトのBitGeneratorに぀いおは話しおいたせん。 NEP 19によるず、これらはレガシヌRandomState゚むリアスのたたであり、そのBitGeneratorはMT19937です。 デフォルトが発生する唯䞀の堎所は、 Generator()が匕数なしでむンスタンス化される堎合です。 ぀たり、ナヌザヌが任意の状態でGeneratorを芁求した堎合、おそらくその䞊で.seed()メ゜ッドを呌び出したす。 実際に必芁なシヌドされたBitGeneratorを䜿甚しお明瀺的にむンスタンス化するのはほが同じくらい簡単なので、これはおそらくかなりたれなこずかもしれたせん。 ここでの正圓な遞択は、実際にはデフォルトを指定BitGeneratorを指定するように芁求するこずかもしれたせん。

それでも、ほずんどの堎合、どのBitGenerator人が䜿甚すべきかに぀いおの掚奚事項がありたす。掚奚事項はかなり自由に倉曎できたすが、堎所に誇りを持っおいる人は、おそらく本、ブログ、チュヌトリアルで最も倚く曞かれるでしょう。 、 など。

IMO、いく぀かの䞻なオプションがありたす私の解説では、同意しないでください。13163からの関連するすべおのコメントを移怍しようずはしおいたせん

デフォルトなし

垞にGenerator(ChosenBitGenerator(maybe_seed))が必芁です。 これは少し䞍芪切ですが、再珟性のためにゞェネレヌタヌを適切に初期化するための非垞に䟿利な方法であるため、デフォルトがある堎合でも、ずにかくこれを行うこずになりたす。

MT19937

これは控えめな遞択です。 それは確かに珟状より悪くはありたせん。 メルセンヌツむスタヌは䟝然ずしお「暙準」の遞択肢ず広く芋なされおいるため、PRNGの特定の品質に関係なく、「非暙準」の遞択肢に疑問を呈する可胜性のある人々が論文をレビュヌする必芁がある孊術ナヌザヌに圹立぀可胜性がありたす。 「IBMを雇ったこずで解雇された人はいたせん。」 MT19937の䞻な欠点は、状態が非垞に倧きいため、利甚可胜な代替手段のいく぀かよりも遅いこずず、いく぀かの統蚈的品質テストに倱敗するこずです。 別のPRNGを遞択する際に、ここで意芋を述べる_機䌚_ただし、_矩務_、IMOではないがあり、必芁に応じお「暙準」を移動しようずしたす。

PCG64

これは、私が個人的に最も頻繁に䜿甚するものである可胜性がありたす。 䞻な欠点は、128ビット敎数挔算を䜿甚するこずです。これは、コンパむラがそのような敎数型を提䟛しない堎合、Cで゚ミュレヌトされたす。 これが圓おはたる2぀の䞻芁なプラットフォヌムは、32ビットCPUず64ビットMSVCであり、CPUがサポヌトしおいる堎合でも128ビット敎数をサポヌトしおいたせん。 個人的には、パフォヌマンスがたすたすたれになる32ビットCPUに遞択を任せるこずはお勧めしたせん。 ただし、MSVCのパフォヌマンスは重芁です。これは、Windowsビルドにはそのコンパむラが必芁であり、他のWindowsコンパむラは必芁ないためです。 おそらくいく぀かのアセンブリ/コンパむラ組み蟌み関数で察凊できたすが、誰かがそれらを䜜成する必芁がありたす。 これを行う必芁があるのはMSVCのみであるずいう事実により、アセンブリに盎面しおいる他の堎合よりも、これがいくらか口圓たりが良くなりたす。

Xoshiro256

小型で高速なPRNGのもう1぀の最新の遞択肢。 いく぀かの既知の統蚈䞊の癖がありたすが、ほずんどの甚途で䞻芁な芁因になる可胜性は䜎いです。 それらの癖は私をそれから遠ざけさせたす、しかしそれは私が曞くこずになるコヌドのための私の個人的な遞択です。

15 - Discussion numpy.random

最も参考になるコメント

このスレッドに非垞に觊発されお、私は報告するいく぀かのニュヌスがありたす 

バックグラりンド

倚くの点で、 pcg64はかなり良いです。 たずえば、統蚈的品質の通垞の枬定では、クリヌンな健康状態が埗られたす。 さたざたな方法でテストされおいたす。 最近では、PractRandを䜿甚しお半ペタバむトたで実行したした。 通垞のナヌスケヌスでうたく機胜したす。

しかし、このスレッドで発生した病状は私にはよく合いたせんでした。 確かに、「たあ、そのように保持しないでください」

それで、玄25日前に、PCGファミリヌの新しいメンバヌを蚭蚈するこずを考え始めたした 

ゎヌル

私の目暙は、珟圚のpcg64バリアントの代わりになる可胜性のある新しいPCGファミリヌメンバヌを蚭蚈するこず

  • 出力関数は、XSL RRよりも倚くのビットをスクランブルする必芁がありたすそうするこずで、このスレッドで発生した問題を回避できるため。
  • パフォヌマンスは、珟圚のpcg64ずほが同じくらい速いたたは速いはずです。
  • 蚭蚈はPCG颚である必芁がありたす぀たり、簡単に予枬できないため、出力関数の䜜業を簡単に元に戻すこずはできたせん。

い぀ものように、できるだけ早く最高の品質を埗ようずするため、トレヌドオフがありたす。 速床をたったく気にしない堎合は、出力関数にさらに倚くのステップを远加しお、より高床にスクランブルされた出力を生成できたすが、PCGのポむントは、基盀ずなるLCGが「ほが十分」であるため、必芁ありたせんでした。 1ず぀増加するカりンタヌのようなもので行うのず同じくらい倚くの努力をしたす。

ネタバレ

成功を報告できるこずをうれしく思いたす。 私が最初にこれに぀いお考えおいた玄25日前、私は実際に䌑暇䞭でした。 箄10日前に戻ったずき、自分が持っおいたアむデアを詊しおみたずころ、うたく機胜しおいるこずがわかりたした。 その埌の時間は、䞻にさたざたな皮類のテストに費やされたした。 昚日は十分満足しおいたので、コヌドをC ++バヌゞョンのPCGに

詳现

FWIW、新しい出力関数は次のずおりです64ビット出力の堎合

uint64_t output(__uint128_t internal)
{
    uint64_t hi = internal >> 64;
    uint64_t lo = internal;

    lo |= 1;
    hi ^= hi >> 32;
    hi *= 0xda942042e4dd58b5ULL;
    hi ^= hi >> 48;
    hi *= lo;
    return hi;
}

この出力関数は、広く䜿甚されおいるxorshift-multiplyに觊発されおいたす。 乗数の遞択は、aマゞック定数の数を抑えるこず、およびb順列が元に戻されないようにするこず䞋䜍ビットにアクセスできない堎合であり、「ランダム化された- PCG出力関数が通垞持぀「それ自䜓」の品質。

その他の倉曎

0xda942042e4dd58b5がこのPRNGおよびすべおのcm_プレフィックス付き128ビット状態PCGゞェネレヌタヌのLCG乗数である堎合もありたす。 比范するず0x2360ed051fc65da44385df649fccf645で䜿甚されるpcg64 、この定数は、分光詊隓性の点ではただ実際にはかなり良いですが、128ビット×64ビットよりも簡単であるため、乗算によるず安いです128ビット×128ビット。 私はこのLCG定数を数幎間問題なく䜿甚しおきたした。 安䟡な乗数バリアントを䜿甚する堎合、呜什レベルの䞊列性を高めるために、出力関数を反埩埌の状態ではなく反埩前の状態で実行したす。

テスト

私はそれを培底的にテストしPractRandずTestU01、満足しおいたす。 テストには、このスレッドで抂説されおいるシナリオが含たれおいたしたたずえば、ギャングゞェネレヌタヌをシヌケンシャルスチヌムで䜿甚するか、2 ^ 64だけ進めお、出力をむンタヌリヌブしたす—4぀のギャングず8192のギャングを8TBたで問題なくテストしたした。ストリヌムずその反察偎の土地の察応物ずしお。

速床

速床テストずベンチマヌクに぀いお詳しく説明するこずができたした。 特定のベンチマヌクで、あるPRNGが別のPRNGよりも速く実行されるかどうかに圱響を䞎えるさたざたな芁因がありたすが、党䜓ずしお、このバリアントは、倚くの堎合、少し速く、時にははるかに速く、時には少し遅くなるようです。 コンパむラやアプリケヌションなどの芁因は、ベンチマヌクの倉動性にはるかに倧きな圱響を及がしたす。

可甚性

C ++ヘッダヌのナヌザヌは、この新しいファミリメンバヌに_now_ずしおpcg_engines::cm_setseq_dxsm_128_64ずしおアクセスできたす。 将来のある時点で、 pcg64をpcg_engines::setseq_xsl_rr_128_64からこの新しいスキヌムに切り替えたす。 私の珟圚の蚈画は、PCG2.0バヌゞョンのバンプの䞀郚ずしお今幎の倏にそうするこずです。

正匏な発衚

党䜓ずしお、私はこの新しい家族にずおも満足しおいたす。倏の埌半のある時点で、このスレッドを参照しおいる可胜性が高い、より詳现なブログ投皿がありたす。

あなたの遞択...

もちろん、これをどうするかを考えなければなりたせん。 あなたがそれを䜿うかどうかに関係なく、私は実際にあなたの速床ベンチマヌクでそれが良くなるか悪くなるかを芋るためにかなり興味がありたす。

党おのコメント166件

Intel Windowsコンパむラは128ビット敎数に察しお䜕をしたすか Windows䞊のMT1993ず比范しお、PCG64はMSVCでコンパむルされるのがどれくらい遅いですか ゞャンプアヘッド機胜が広く䜿われるのではないかず思うので、デフォルトで持っおおくずいいかもしれたせん。

Intel Windowsコンパむラは128ビット敎数に察しお䜕をしたすか

完党にはわかりたせん。 ICCが制玄を受けたいず思うABIの圱響があるかどうかはわかりたせん。 生成されたアセンブリに぀いお䜿甚できるアむデアを知りたいだけの堎合は、これが䟿利なリ゜ヌスです https 

ゞャンプアヘッド機胜が広く䜿われるのではないかず思うので、デフォルトで持っおおくずいいかもしれたせん。

むしろ、蚭定可胜なストリヌムを意味したすか それは良い点ですが、逆にカットできないのではないかず思いたす。 デフォルトの遞択が実際に非垞に重芁である堎合、おそらくこれらのより完党な機胜を備えたPRNGのいずれかを遞択するず、人々はそれらの「高床な」機胜が必芁であるこずを文曞化せずに、ラむブラリコヌドでこれらの機胜をより広範囲に䜿甚したす。 「暙準」でご利甚いただけたす。 しかし、別のナヌザヌが速床やその他の理由で機胜の少ないBitGeneratorでそのラむブラリを䜿甚しようずするず、レンガの壁にぶ぀かりたす。 No defaultたたはMT19937䞖界では、図曞通は必芁な高床な機胜に぀いお考え、文曞化する可胜性が高くなりたす。

䞀方で、その䞍枬の事態により、蚭定可胜なストリヌムのないBitGeneratorあたり望たしくないように芋えたす。私は、その方向でベストプラクティスず芋なされるものを進めるずいう抂念が奜きです玔粋に個人的に;私は感じたせん NumPy-the-projectにその抂念を共有させる矩務。 コヌドの途䞭で.seed()を䜿甚しおいる人に芋られる、いく぀かの悪甚を回避するのに圹立぀可胜性がありたす。 しかし、繰り返しになりたすが、デフォルトがあるず人々の行動が倧幅に倉わるずいう考えに基づいおいるため、これらの懞念はすべおかなり軜枛される可胜性がありたす。

Windows䞊のMT1993ず比范しお、PCG64はMSVCでコンパむルされるのがどれくらい遅いですか

@bashtageが13163に投皿したベンチマヌクでは、PCG64はMT19937のほが半分の速床であり、MSVCやその仲間のパフォヌマンスにはかなり期埅倖れです。 Linuxでは23高速です。

Intel Windowsコンパむラは128ビット敎数に察しお䜕をしたすか

Clang、GCC、Intelコンパむラなどの他のコンパむラは、32ビットシステムで64ビット敎数を実装したのず同じ方法で64ビットシステムに128ビット敎数を実装したす。 新しいアむデアを必芁ずしないすべお同じテクニック。 MicrosoftはMSVCに察しおそれをわざわざ行わなかったので、コンパむラによっお盎接サポヌトされる128ビット敎数はありたせん。

その結果、MSVCの堎合、13163のPCG64の既存の実装は、x86_64の_umul128などのMicrosoft組み蟌み関数を呌び出すこずにより、128ビットの蚈算を手動で実装したすおそらく、代わりに_mulx_u64などの同等でよりポヌタブルなIntel組み蟌み関数を䜿甚するこずもできたす。これにより、GCC、Clang、およびIntelコンパむラが単独で行うこずをコヌディングしたす。 最倧の問題は、Microsoftのコンパむラがこれらの組み蟌み関数を十分に最適化しおいない可胜性がありたす少なくずもむンラむン化されおいるこずを願っおいたすか。 手䜜業でコヌディングされたアセンブラの方が高速になる可胜性はありたすが、適切な修正は、コンパむラがそれほど悪魔的に貧匱ではないこずです。

ゞャンプアヘッド機胜が広く䜿われるのではないかず思うので、デフォルトで持っおおくずいいかもしれたせん。

ゞャンプしおよかったのですが、なぜ広く䜿われるのか気になりたす。 個人的には、2぀のPRNGがどれだけ離れおいるかを瀺すdistance本圓に奜きです。これはPCGのC ++バヌゞョンにありたすが、Cバヌゞョンにはありたせん。远加するのは簡単です。興味。

ゞャンプしおよかったのですが、なぜ広く䜿われるのか気になりたす。

おそらく珟圚の甚語に慣れおいない。 ぀たり、シミュレヌションを䞊行しお実行するために䜿甚できる、簡単に取埗できる独立したストリヌムです。 䞊列化できるシミュレヌションの問題の数はわかりたせんが、倚くの問題があり、最近のチップに搭茉されるコアの数を考えるず、速床の䞍利を簡単に補うこずができるず思いたす。

MicrosoftはMSVCに察しおそれをわざわざ行わなかったので、コンパむラによっお盎接サポヌトされる128ビット敎数はありたせん。

そのため、私たちの車茪を傷぀けるでしょう、OTOH、Windowsの倚くの人々はAnacondaたたはEnthoughtからパッケヌゞを入手したす。どちらもIntelを䜿甚し、パフォヌマンスを本圓に気にする人々はおそらくLinux、Mac、たたはおそらくAIXです。

線集そしおおそらくマむクロ゜フトが懞念しおいるなら、圌らは問題を解決するための報奚金を提䟛するこずができたす。

FWIW、これが重芁な関数のためにclangが生成するアセンブリです。これには、 uint128_tをuint64_tの構造䜓にアンパック/再パックするために必芁なビットが含たれたす。https// godbolt.org/z/Gtp3os

ずおもかっこいい、@ rkern。 同じこずをしお、MSVCが手曞きの128ビットコヌドで䜕をしおいるのかを確認できる可胜性はありたすか

ずおもかっこいい、@ rkern。 同じこずをしお、MSVCが手曞きの128ビットコヌドで䜕をしおいるのかを確認できる可胜性はありたすか

それは、ええず、きれいではありたせん。 〜https//godbolt.org/z/a5L5Gz〜

おっず、 -O3を远加するのを忘れたしたが、それでも醜いです https 

それほど悪くはありたせん。 最適化がオンになっおいないため、䜕もむンラむン化されたせんでした。 /Oxを远加したしたもっず良いオプションがあるかもしれたせんか。 たた、MSVCはC回転むディオムを芋぀けるこずができないため、組み蟌みの回転組み蟌み関数 _rotr64 を䜿甚するようにコヌドを修正したした。

それでも䞀皮の列車事故です。 しかし、少し泚意を払えば、PCG64コヌドを埮調敎しお、MSVCでコンパむルし、誰にずっおもたったく恥ずかしくないものにするこずができるず蚀っおも過蚀ではありたせん。

他のすべおをマヌゞできるようにするために、今のずころ「デフォルトなし」を遞択しおみたせんか これにより、互換性を損なうこずなく、埌で1぀以䞊のリリヌスの埌でもデフォルトを自由に決定できたす。

ほずんどのナヌザヌは乱数の専門家ではないため、デフォルトを提䟛する必芁がありたす。

「今、圌らはより倚くのコヌドを入力する必芁がある」ずいう無䜜法を超えお、䜕かを倉曎するずどうなりたすか BitGeneratorがハヌドコヌディングされおいる堎合デフォルトを提䟛しなかったため、掗緎されおいないすべおのナヌザヌはコヌドをリファクタリングする必芁があり、うたくいけば圌らの遞択のニュアンスを理解する必芁がありたす私たちは自分たちの間で䜕に同意するこずさえできないこずに泚意しおください最高です。 ただし、デフォルトを提䟛するず、新しいデフォルトたたは新しいバヌゞョンはビットストリヌムず互換性がないため、テストが䞭断される可胜性がありたす。

ビットストリヌムが垞に䞀定であるずいう仮定ず、 NumPy開発者が䜕をしおいるのかを知っおいるずいう仮定ず、デフォルト倀が最高のブランドである必芁があるずいう仮定ずの間で、たずえそれがあったずしおも、私は2番目の仮定の偎で誀りを犯したす最初を壊したす。

線集どの開発者が圌らが䜕をしおいるかを知っおおくべきかを明確にする

ほずんどのナヌザヌは乱数の専門家ではないため、デフォルトを提䟛する必芁がありたす。

ええず、少なくずも、デフォルトがあるかどうかやデフォルトが䜕であるかに関係なく、掚奚事項を文曞化するこずは確かです。

「今、圌らはより倚くのコヌドを入力する必芁がある」ずいう無䜜法を超えお、䜕かを倉曎するずどうなりたすか

どんな「䜕か」を考えおいたすか 私はあなたの議論に埓うこずができたせん。

「今、圌らはより倚くのコヌドを入力する必芁がある」ずいう無䜜法を超えお、䜕かを倉曎するずどうなりたすか

どんな「䜕か」を考えおいたすか 私はあなたの議論に埓うこずができたせん。

@mattipは、デフォルトのビットゞェネレヌタの倉曎を指したす。

このwoudlは、それを採甚したナヌザヌを怒らせ、coudlはコヌドの倉曎を必芁ずしたす。

たずえば、

g = Generator()
g.bit_generator.seed(1234)

基になるビットゞェネレヌタが倉曎された堎合、これは間違っおいたす。

あなたがもっず正気なこずをしお䜿ったなら

Generator(BitGenerator(1234))

その埌、あなたはそれを芋ないでしょう。

IMO、デフォルトの遞択を怜蚎するずきは、基瀎ずなるビットゞェネレヌタヌに臎呜的な欠陥が芋぀かるか、IntelがそのチップにQUANTUM_NIを远加するたで修正されたず考える必芁がありたす。これにより、ランダムなパフォヌマンスがOOM改善されたす。

私はここでは少し郚倖者だず思いたすが、どのPRNGがデフォルトの遞択であるかが氞久に修正され、倉曎されないこずを期埅するのは合理的ではないず思いたす。 たずえば、C ++では、 std::default_random_engineは実装の裁量であり、リリヌスごずに倉曎できたす。

むしろ、以前の結果を再珟するメカニズムが必芁です。 したがっお、特定の実装が存圚するず、それを倉曎するこずは非垞にクヌルではありたせんたずえば、MT19937 _is_ MT19937、異なる出力を䞎えるように調敎するこずはできたせん。 [そしお、すでに存圚する実装を削陀するのもクヌルではありたせん。]

デフォルトが倉曎された堎合、叀い結果を再珟し続けたい人は、以前のデフォルトを名前で尋ねる必芁がありたす。 以前のリリヌスに察応するデフォルトを遞択するメカニズムを提䟛するこずで、これを行うこずができたす。

ずは蚀うものの、デフォルトのゞェネレヌタヌを別のものに亀換するこずが蚱可されおいる堎合でも、それは本圓に厳密に改善する必芁がありたす。デフォルトのゞェネレヌタヌに存圚する機胜はすべお、将来その機胜をサポヌトするずいうコミットメントを衚しおいたす。 デフォルトのゞェネレヌタヌに効率的なadvanceがある堎合、埌でそれを実際に取り陀くこずはできたせん。 この問題を回避するために、デフォルトのゞェネレヌタヌの高床な機胜を無効にする可胜性がありたす。

芁玄するず、デフォルトが氞久に倉曎されない契玄に自分自身を固定しようずせずに、䜿甚が再珟可胜な結果を​​もたらすこずができるこずを確認する方法がありたす。 それはたたあなたがする遞択のための賭け金を枛らすでしょう。

FWIWは、これは私がPCGに䜕をしたかである。デフォルトのPCG 32ビットのPRNGが珟圚のようにアクセスXSH-RRの倉皮である[ pcg_setseq_64_xsh_rr_32_random_r Cラむブラリずでpcg_engines::setseq_xsh_rr_64_32 Cでクラス++ラむブラリ]ですが、原則ずしお、将来を芋据えた再珟性が本圓に必芁な堎合は、゚むリアスであるpcg32_random_rたたはpcg32を䜿甚するのではなく、XSH-RRを明瀺的に指定する必芁がありたす。原則ずしお他のものにアップグレヌドできたす。 。

それは本圓に氞遠ではありたせんこのプロゞェクト党䜓の90は、玄14幎前に行われた本物の、本物の、そしお名誉ある氞遠の玄束によっお掚進されおいたすが、あなたが蚀うように、切り替えにはa倉曎する説埗力のある理由ずb枛䟡償华サむクルを䞎えるために少なくずも数幎かかりたす。

今日はそれをできるだけ正しくするために䞀生懞呜努力する方がはるかに良いです。

もちろん、犁止されおいないこずの1぀は、リリヌス埌に同じ倀を生成するlognずしおPRNGコヌドを改善するこずです。 たずえば、uint128を䜿甚するPRNGを䜿甚した堎合、MSにuint128サポヌトを远加さ​​せるかファットチャンス、将来のバヌゞョンでWin64のアセンブリを远加するこずができたす。

たずえば、

g = Generator()
g.bit_generator.seed(1234)

基になるビットゞェネレヌタが倉曎された堎合、これは間違っおいたす。

そうです、@ eric-wieserを䜿甚しお、「デフォルトなし」オプションに぀いお議論しおいるようです。これは、最初のステヌトメント「ほずんどのナヌザヌは乱数の専門家ではないので、デフォルトを提䟛する必芁がありたす。 。」

デフォルトなしずフレンドリヌの間で、完党にデフォルトを想定しお、私は垞に埌者を遞択したす

今

Generator() # OK
Generator(DefaultBitGenerator(seed)) # OK
Generator(seed) # error

_my_蚭定

Generator(1234) == Generator(DefaultBitGenerator(1234)
Generator(*args**kwargs) == Generator(DefaultBitGenerator(*args, **kwargs))

今ではこれがうたくいくずは思いたせんが、RandomStateの䜿甚を延長する1぀の方法は、ビットゞェネレヌタヌを遞択するのに十分な専門家であるず感じるナヌザヌのみがこれを利甚できるようにするこずだず思いたす。

芁玄するず、デフォルトが氞久に倉曎されない契玄に自分自身を固定しようずせずに、䜿甚が再珟可胜な結果を​​もたらすこずができるこずを確認する方法がありたす。 それはたたあなたがする遞択のための賭け金を枛らすでしょう。

はい、ありたす。 ナヌザヌは名前でBitGeneratorを取埗したずえば、 MT19937 、 PCG64など、シヌドを䜿甚しおむンスタンス化できたす。 BitGeneratorオブゞェクトは、均䞀な[0..1) float64ず敎数およびそれらが持぀楜しいゞャンプアヘッド/ストリヌム機胜を描画するための限られたメ゜ッドセットを䜿甚しお、コアの均䞀PRNGアルゎリズムを実装したす。 。 私たちが話しおいるGeneratorクラスは、提䟛されたBitGeneratorオブゞェクトを受け取り、それをラップしお、すべおの䞍均䞀分垃、ガりス分垃、ガンマ、二項匏などを提䟛したす。 BitGeneratorの厳密なストリヌム互換性保蚌。 私たちはリリヌスするために䜕も取り陀くこずはなく、それらを倉曎するこずもありたせん。

デフォルトに関する䞭心的な質問は、「匕数のないコヌドg = Generator()は䜕をするのか」です。 珟圚、PRでは、任意の状態でXoshiro256 BitGeneratorを䜜成したす぀たり、 /dev/urandomような優れた゚ントロピヌ゜ヌスから抜出されたす。 「デフォルトなし」オプションは、それを゚ラヌにするこずです。 ナヌザヌは、必芁なBitGeneratorに明瀺的に名前を付ける必芁がありたす。 @ eric-wieserのポむントは、「デフォルトなし」は、最初のリリヌスではカテゎリ別に_safe_オプションであるずいうこずです。 デフォルトを提䟛する新しいリリヌスでは、既存のデフォルトを倉曎するのず同じように問題が発生するこずはありたせん。

@rkern 、シヌドが利甚可胜な゚ントロピヌから自動生成される匕数なしの堎合のみを気に

察照的に、 @ bashtageは、シヌドが提䟛されおいるデフォルトのゞェネレヌタヌを気にしおいるようです。

@rkern 、シヌドが利甚可胜な゚ントロピヌから自動生成される_匕数なし_の堎合のみを気にする堎合は、基瀎ずなるゞェネレヌタヌが䜕であるかは実際にはそれほど重芁ではありたせん。結果は再珟できないため、1時間ごずに倉曎される可胜性がありたす実行が異なれば、シヌドも異なりたす。

䜜成埌、 BitGeneratorを再シヌドできたす。 したがっお、 Generator()機胜する堎合、シヌドされたPRNGが必芁な人は、 @ bashtageの䟋のように、次の行にシヌドするだけであるず私は完党に予想しおいたす。

g = Generator()
g.bit_generator.seed(seed)

それはやや面倒です。そのため、タむピングに関しおはほが同じくらい䟿利なので、ずにかくほずんどの人が通垞Generator(PCG64(<seed>))遞ぶだろうず私が最初に提案した理由です。 ただし、 @ bashtageは、远加の決定を行うこずに盎面したずきに、ある皋床の抵抗を正しく蚘録したす。

ですから、私たちの前にはもっず広い質問があるず思いたす。「ナヌザヌにこれらの1぀をむンスタンス化しおほしいすべおの方法は䜕ですかたた、それらの方法にデフォルト蚭定がある堎合、それらのデフォルトはどうあるべきですか」 いく぀かのオヌプンデザむンスペヌスがあり、 @ bashtageによるGenerator(<seed>)たたはGenerator(DefaultBitGenerator(<seed>))の提案はただ可胜です。

@bashtageドキュメントはどのくらい圹立぀ず思いたすか ぀たり、䞀番䞊で「 PCG64が掚奚されるデフォルトのBitGenerator 」であり、すべおの䟋で䞀貫しおGenerator(PCG64(seed))を䜿甚した堎合他のアルゎリズムを具䜓的に瀺しおいない堎合

Generator(<seed>)たたはg=Generator();g.seed(<seed>)超えるGenerator(<seed>) default_generator(<seed>) _ function_があるず確信しおいるかもしれたせん。 次に、本圓に倉曎する必芁があり、䜕かを壊したくない堎合は、新しい関数を远加しお、叀い関数に譊告を远加するだけで枈みたす。 最初のリリヌスではexperimentalずマヌクするこずをお勧めしたす。これにより、確固たるコミットメントを行う前に、このむンフラストラクチャを実際に監芖する時間が䞎えられたす。

内郚状態の詳现を公開しないDefaultBitGeneratorオブゞェクトを実際に䜜成するの

Generator匕数ずしお敎数シヌドを盎接サポヌトする方がはるかに䜿いやすいずいう@bashtageに同意したす䟋 np.random.Generator(1234) 。 もちろん、これはDefaultBitGeneratorたす。

Generatorドキュメントでは、NumPyの過去の各バヌゞョンでのデフォルトのビットゞェネレヌタヌの完党な履歎を提䟛できたす。 これは基本的に@imnemeの提案であり、再珟性の目的には十分だず思いたす。

以前のコメントに察するこの線集を芋たばかりです

おっず、 -O3を远加するのを忘れたしたが、それでも醜いです https 

MSVCの堎合、 -O3ではなく、 /O2たたは/Ox ただし、 /O3はありたせん。

Generatorドキュメントでは、NumPyの過去の各バヌゞョンでのデフォルトのビットゞェネレヌタヌの完党な履歎を提䟛できたす。 これは基本的に@imnemeの提案であり、再珟性の目的には十分だず思いたす。

実際には、ピクルスのprotocol匕数のような明瀺的なversion匕数をGenerator / DefaultBitGeneratorに含める方がさらに良いでしょう。 次に、 np.random.Generator(123, version=1)ようなものを蚘述しお、「バヌゞョン1」の乱数それが䜕であれが必芁であるこずを瀺し、 np.random.Generator(123, version=np.random.HIGHEST_VERSION) デフォルトの動䜜が最新/最倧のビットゞェネレヌタヌが必芁であるこずを瀺したす。 それが䜕であれ。

おそらくversion=0はNumPyがこれたで䜿甚しおきたMT19937であり、 version=1は私たちが遞んだ新しいデフォルトである可胜性がありたす。

内郚状態の詳现を公開しないDefaultBitGeneratorオブゞェクトを実際に䜜成するのはどうですか これは、他のビットゞェネレヌタオブゞェクトの1぀のプロキシになりたすが、原則ずしお、生成された数倀の特定のシヌケンスを陀いお、それらのいずれかをラップするこずができたす。 これにより、ナヌザヌがデフォルトのBitGeneratorで䜕ができるかに぀いおプログラムで掚枬するこずを思いずどたらせながら、改善されたアルゎリズムを䜿甚できるようになるこずを願っおいたす。

うヌん。 それは魅力的です。 物事を耇雑にしすぎお、このゎヌディアンノットに別のルヌプを远加しおいるように感じたすそしお、もっずアレクサンダヌ颚のストロヌクが利甚できるはずですが、それに぀いお私が蚀わなければならない唯䞀の悪いこずです。 これにより、残りの決定が容易になりたす。統蚈的な品質ずパフォヌマンスに集䞭できたす。

実際には、 Generator / DefaultBitGenerator 、 pickleような明瀺的なversion匕数を含める方がよいでしょう。

私はこれのファンではありたせん。 pickle堎合ずは異なり、これらには䜿甚できる意味のある名前があり、メカニズムはすでに実装されおいたす。

私はこれのファンではありたせん。 pickle堎合ずは異なり、これらには䜿甚できる意味のある名前があり、メカニズムはすでに実装されおいたす。

兞型的なNumPyナヌザヌの芳点から次のこずを考慮しおください。

  • np.random.Generator(seed, version=0) vs np.random.Generator(seed, version=1)
  • np.random.Generator(MT19937(seed)) vs np.random.Generator(PCG64(seed))

ほずんどのナヌザヌは、RNGアルゎリズムの盞察的なメリットに぀いおほずんど知らないず考えるのが安党だず思いたす。 ただし、ドキュメントを読たなくおも、ほずんどの堎合、 version=0 version=1 新しいデフォルトの方がversion=0よりも優れおいるはずだず安党に掚枬できたす。 ほずんどのナヌザヌにずっお、それは本圓に圌らが知る必芁があるすべおです。

察照的に、 MT19937やPCG64ような名前は、実際には専門家、たたはすでにドキュメントを読んだ人にずっおのみ意味がありたす:)。

あなたのナヌスケヌスでは、誰も圌らが_望んでいるversionを遞択しおいたせん。 既知のバヌゞョンの結果を耇補するために_必芁な_ versionのみを遞択したす。 圌らは垞に、耇補したい結果で䜿甚された特定の倀を探しおいたす暗黙的に蚱可したため、暗黙的に。 耇数の倀の間の関係に぀いお掚論する必芁はありたせん。

そしお、いずれにせよ、そのレベルのクロスリリヌスの再珟性は、 NEP19で私たちが攟棄したものです。 ディストリビュヌションのバヌゞョン管理に反察する議論は、ここでも同様に圓おはたりたす。

デフォルトに関するいく぀かの考え

  • 99.9のナヌザヌは、基瀎ずなるアルゎリズムを気にしない、たたは知りたくない、ただ乱数が欲しいだけです。 したがっお、デフォルトの意芋を遞択するための+1は、ナヌザヌに遞択させないでください。
  • dSFMTは、 MT19937よりも単玔に高速なバヌゞョンのようですドキュメントで「SSE2」をどれだけ高速に削陀するかを説明するずよいでしょう。 ずにかくビットストリヌムの再珟性を保蚌するものではないので、内郚状態の違いはあたり面癜くなく、ここでの勝利の議論が「蚘事のレビュヌ䞭の生掻を楜にする」であっおも、 dSFTMはMT19937も優先されるべきです。
  • パフォヌマンスは、ナヌザヌベヌスのかなりの郚分にずっお重芁です。 ゞェネレヌタの統蚈的特性は、ごく䞀郚のナヌザヌにのみ重芁です。 含たれおいるすべおのゞェネレヌタヌは、通垞のナヌスケヌスでは問題ありたせん。 したがっお、デフォルトずしお最速のものを遞択するための+1。

申し蚳ありたせんが、Windowsでは32ビットが匕き続き重芁です。https //github.com/pypa/manylinux/issues/118#issuecomment-481404761を参照しお

デヌタ分析でのリサンプリング手法の䜿甚拡倧に向けお倧きな転換期を迎えおいるため、統蚈的特性には十分泚意する必芁があるず思いたす。 Pythonがこの問題に関しお少しずさんな評刀を埗た堎合、たずえそれがデフォルトであったずしおも、それはデヌタ分析のためにPythonを怜蚎しおいる人々による取り蟌みの障壁になる可胜性がありたす。 順列ずシミュレヌションを真剣に受け止めおいる人々にずっおPythonが最適なパッケヌゞであるずしたら、私は非垞に嬉しく思いたす。

より高速な最先端ではないアルゎリズムを提䟛するこずは問題ないず思いたすが、デフォルトではなく、それを回避しお䞋䜍互換性を維持できる範囲で提䟛したす。

いく぀かのフォレンゞックずディスカッションに぀いおは、 https  ください。

教科曞には、重倧な゚ラヌを発生させるこずなく、PRNGを真のIIDU [0,1倉数に眮き換えるこずができるず暗黙的たたは明瀺的に想定する方法が蚘茉されおいたす[20、7、2、16、15]。 ここでは、MATLAB、Pythonのランダムモゞュヌル、R、SPSS、Stataなど、䞀般的に䜿甚される倚くの統蚈パッケヌゞのアルゎリズムでは、この仮定が正しくないこずを瀺したす。

@ kellieotto 、 @ pbstark-順列ずブヌトストラップの可胜な限り最良の基瀎を䞎えるために、ここでどのPRNGを遞択すべきかに぀いお意芋がありたすか

デヌタ分析でのリサンプリング手法の䜿甚拡倧に向けお倧きな転換期を迎えおいるため、統蚈的特性に぀いおは倚くの泚意を払う必芁があるず思いたす。

同意したした。 これらのプロパティが実際のナヌスケヌスに関連しおいる限り、それは非垞に重芁です。 通垞提起される懞念は垞に非垞に孊術的です。

いく぀かのフォレンゞックずディスカッションに぀いおは、 https  ください。

非垞に興味深い蚘事。 R、Python stdlibcoずは異なり、NumPyはそれを正しく行う唯䞀のラむブラリ9ペヌゞの䞊郚であるず結論付けおいたす。

論文よりもさらに具䜓的な䟋を入手するこずは非垞に有甚です。 珟圚のデフォルトゞェネレヌタヌもある時点で故障した堎合、それはい぀ですか Rのsample関数のような䟋では、玄17億のサンプルを描画するずきに、40の偶数ず60の奇数を生成したす。 ここでのブヌトストラップ/リサンプリングの同等物は䜕ですか

R3.6の最新リリヌスでは、切り捚おずランダムビットのアプロヌチが修正されおいたす。
ランダムな敎数を生成したす。 メルセンヌツむスタヌはデフォルトのたたです
ただし、PRNG。

@Kellieオットブニ[email protected]ず私はデフォルトのPRNGで思いたす
科孊蚀語ず統蚈パッケヌゞは暗号化する必芁がありたす
安党CS-PRNG、䟋カりンタヌモヌドのSHA256、フォヌルするオプション付き
より速いが品質の䜎いものに戻る䟋、メルセンヌツむスタヌ
速床が必芁な堎合。

Python甚のCS-PRNGに取り組んできたした
https://github.com/statlab/cryptorandom

パフォヌマンスはただ玠晎らしいものではありたせん。 ボトルネックは型倉換のようです
Python内で、バむナリ文字列ハッシュ出力を敎数ずしおキャストしたす。 私たちは
より倚くの䜜業をCに移す実装に取り​​組んでいたす。

也杯、
フィリップ

2019幎5月27日月曜日午前6時27分ラルフゎマヌズ[email protected]
曞きたした

私たちは統蚈的性質に倚くの泚意を払うべきだず思いたす。
リサンプリング手法のより倚くの䜿甚ぞの倧きなシフトの過皋で
デヌタ解析

同意したした。 それらのプロパティが実際の䜿甚に関連しおいる限り
堎合、それは非垞に重芁です。 通垞提起される懞念は
垞に非垞に孊術的です。

いく぀かのフォレンゞックずディスカッションに぀いおは、以䞋を参照しおください。
https://arxiv.org/pdf/1810.10985.pdf

非垞に興味深い蚘事。 NumPyは玄唯䞀のものであるず結論付けおいたす
R、Python stdlibcoずは異なり、それを正しく行うラむブラリ9ペヌゞの䞊郚。

より具䜓的な䟋を取埗するこずは非垞に圹立ちたす
論文。 珟圚のデフォルトゞェネレヌタヌもある時点で故障した堎合、
それはい぀ですか Rのサンプル関数のような䟋は40も生成したす
箄17億のサンプルを描画する堎合、数倀ず60の奇数。 䜕ですか
ここで同等のブヌトストラップ/リサンプリング

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWJEIA4CTLLHVGZVKBLPXPOUFA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AANFDWJW445QDPGZDGXMPA3PXPOUFANCNFSM4HPX3CHA
。

-
フィリップ・B・スタヌク| ア゜シ゚むトディヌン、数孊および物理科孊|
統蚈孊郚教授|
カリフォルニア倧孊
バヌクレヌ、カリフォルニア94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark

パフォヌマンスは、ナヌザヌベヌスのかなりの郚分にずっお重芁です。 ゞェネレヌタの統蚈的特性は、ごく䞀郚のナヌザヌにのみ重芁です。 含たれおいるすべおのゞェネレヌタヌは、通垞のナヌスケヌスでは問題ありたせん。 したがっお、デフォルトずしお最速のものを遞択するための+1

たず、「最速」を遞択する方法はありたせん。 @bashtageは、13163の珟圚のコヌドで

たた、速床を気にするナヌザヌの「かなりの割合」がどれだけ倧きいのだろうか。 Python自䜓は、平均しおCより​​も玄50倍遅くなりたす。 NumPyナヌザヌベヌスのどの郚分がPyPyで実行しおいたすか4倍の速床ブヌストが埗られたす 確かにいく぀かありたすが、それほど倚くはないず思いたす。

そしお、䞊蚘で抂説したすべおの倉動性を考えるず、速床を気にするその「重芁な郚分」に぀いお、デフォルトのPRNGがアプリケヌションで最も速く実行されるずいうあなたの蚀葉を誰が受け入れるのでしょうか。 賢明なこずこれも非垞に楜しく、ほずんどのナヌザヌの手の届く範囲にありたすは、利甚可胜なさたざたなPRNGのベンチマヌクを行い、どれが最も速いかを確認するこずです。

察照的に、圌らはドキュメントに手がかりを芋぀けるかもしれたせんが、あなたが指摘するように、特定のPRNGの統蚈的品質を理解するこずは、ほずんどのナヌザヌのレヌダヌではありたせんそしお専門家にずっおさえ挑戊的です。 ほずんどの人は、い぀/気にかけるべきかどうかさえ知りたせん。 ここは父性䞻矩の堎であるず私は䞻匵したす。ほずんどのナヌザヌが䜕かを気にしないずいう事実は、メンテナがそれを気にしないずいう意味ではありたせん。

含たれおいるすべおのPRNGがほずんどのナヌスケヌスで問題ないこずは事実ですが、それはかなり䜎い基準です。 Unixシステムには、統蚈的にひどいCラむブラリPRNGが倚数付属しおいたすが、䞖界がその軞から倖れるこずなく、䜕幎にもわたっお広く䜿甚されおきたした。

統蚈的プロパティ以倖にも、ナヌザヌが自分で欲しいずは思わないかもしれないが、私が欲しいず思うかもしれないプロパティがありたす。 個人的には、PRNGのプロバむダヌずしお、些现な予枬可胜性を避けたいず思っおいたす。誰かがPRNGからのいく぀かの出力を芋お、将来のすべおの出力がどうなるかを蚀うこずができるようにしたくありたせん。 NumPyが䜿甚されるほずんどのコンテキストでは、予枬可胜性は問題ではありたせん。シヌケンスを簡単に予枬できるこずで恩恵を受ける敵は存圚したせん。 しかし、誰かがNumPyのPRNGを䜿甚するのは、統蚈を行うためにNumPyが必芁なためではなく、以前にPRNGを芋぀けた堎所だからです。 そのコヌドは、PRNGを予枬できるこずで恩恵を受ける実際の敵に盎面する可胜性がありたす。 この異垞倀の状況に察しおしっかりず保険をかけるために倚額の支払いたずえば、速床の倧幅な䜎䞋をするこずは䟡倀がありたせんが、適床な保険はそれだけの䟡倀があるかもしれたせん。

いく぀かのフォレンゞックずディスカッションに぀いおは、 https  ください。

教科曞には、重倧な゚ラヌを発生させるこずなく、PRNGを真のIIDU [0,1倉数に眮き換えるこずができるず暗黙的たたは明瀺的に想定する方法が蚘茉されおいたす[20、7、2、16、15]。 ここでは、MATLAB、Pythonのランダムモゞュヌル、R、SPSS、Stataなど、䞀般的に䜿甚される倚くの統蚈パッケヌゞのアルゎリズムでは、この仮定が正しくないこずを瀺したす。

FWIW、バむアスのない範囲の数倀を効率的に生成するこずに぀いおの@lemireによる玠晎らしい論文がありたす。 私はそれを、自分の蚘事でもいく぀かのベンチマヌクを調査しお実行するための出発点ずしお䜿甚したした。 64ビットを生成する堎合、Lemireの方法では128ビットの乗算を䜿甚しお、64ビットの遅い陀算を回避したす。MSVCナヌザヌに発生する可胜性のあるよく知られた問題はすべおありたす。

@pbstark @kellieotto arXivに掲茉されたずき、興味を持っおあなたの論文を読みたした。 私はBIDSの䜕人かの友人を蚪ねおいたした、そしお圌らはあなたの仕事に぀いお蚀及したした。 ディスカッションセクションでは、MT19937の「これたでのずころ、O10 ^ 5レプリケヌションで怜出されるのに十分な倧きさの䞀貫したバむアスを持぀統蚈は芋぀かりたせんでした」ず述べおいたす。 もう芋぀けたしたか PCG64のような128ビット状態のPRNGの具䜓的な䟋を芋぀けたしたか これは、少なくずも汎甚のデフォルトを遞択する目的で、この考慮事項が他の考慮事項IMOを䞊回り始める可胜性がある、実甚的な関連性の劥圓なしきい倀であるように思われたす。

新しいPRNGフレヌムワヌク13163の優れた機胜は、プラグむンするだけで誰でも独自のBitGeneratorを提䟛できるこずです。Numpyで䜿甚するためにNumpyである必芁はありたせん。コヌド。 cryptorandomをCでBitGeneratorずしお実装するこずを怜蚎するこずをお勧めしたす。そうすれば、他のオプションず盎接比范できたす。

個人的には、スピヌドを本圓に気にする人は、必芁に応じおさらに䞀歩前進するこずを期埅しおいたすここではそれほど倚くはありたせん。 安党なデフォルトを提䟛する必芁がありたす。珟圚の私の掚枬では、これは暗号化を陀くすべおの目的で安党なデフォルトを意味したすおそらくドキュメントに譊告があるはずです。 倚くのナヌザヌは速床を気にかけおいたすが、率盎に蚀っお、私が速床を高くしすぎるこずを躊躇しおいるのはそのためです。
Numpyがうたくいったその蚘事は面癜そうですがおそらくそれを正しくするためにRobertに賛蟞を送りたす、実際にはビットゞェネレヌタではなくサンプラヌです。

@pbstark numpy / randomgenず互換性のあるBitGeneratorずしおこれを実装したいず思うかもしれたせんか それはおそらく、䞡方のそれをスピヌドアップし、より倚くの有甚な圢態で幅広い芖聎者が利甚できるようにする最も簡単な方法がありたす。 あなたずケリヌ・オットボニはバヌクレヌにいるようですので、それを実珟するためにしばらく䌚うこずができたすか ただの申し出ですが、最初に自分でコヌドを詳しく調べる必芁がありたす。

その_RandomSamplingPractice Makes Imperfect_玙に関しおは、良い読み物ですが、1兆個のコアが1ナノ秒あたり1぀の数倀を100幎間生成した堎合、生成される数倀は2 ^ 102未満になるこずを芚えおおく䟡倀がありたす。

簡単に予枬できるPRNGメルセンヌツむスタヌのような倧きな状態空間を持぀ものでもの堎合、特定の出力シヌケンスを生成できるかどうかを実際に知るこずができたす存圚する堎合はそれを生成するシヌドを芋぀け、存圚しない堎合は物欲しそうに感じたす が、他の自明ではない予枬可胜なPRNGの堎合、どの出力シヌケンスが生成されないか、どの出力シヌケンスが存圚するかを簡単に知るこずはできたせんが、十分にたれであるため、怜玢の期間䞭にそれらを芋぀けるこずはほずんどありたせん。 ご存知かもしれたせんが、2 ^ 80の出力内に_TwelthNight_を含むzipファむルを吐き出すこずがわかっおいるPRNGがありたすが、幞運を祈りたす。

本圓にcryptoprngが必芁な堎合は、最新のハヌドりェアでの唯䞀の遞択肢は
専甚の呜什があるため、AES。 @lemireには実装がありたす
ここhttps://github.com/lemire/testingRNG/blob/master/source/aesctr.hその
noncryptoゞェネレヌタヌず同じくらい高速です。 行くこずができるChaCha20もありたす
SIMDで高速。 ただし、どちらも叀いハヌドりェアでは非垞に遅くなりたす。 ThreeFryず
Philoxはすでに含たれおおり、cryptoliteカりンタヌprngです。

IMO暗号は、費甚䟿益の点で過倧評䟡されおいたす。 私は䜕も知らない
山のPRNG問題による重芁な撀回
10e6の出版された論文の順序で䜿甚されたす。 私が芋た唯䞀のアプリケヌション
PRNGが本圓に問題だったのは、期間がそうだった堎合でした
発電機が党サむクルを完了したこずは小さい。 ここでも唯䞀
効果は、䞻なものを耇補した研究のサンプルサむズを枛らすこずでした
結果は、より長い期間のシステムで再実行されたす。

月、2019幎5月27日には、午埌07時50分ロバヌト・カヌンの[email protected]は曞きたした

@pbstark https://github.com/pbstark @kellieotto
https://github.com/kellieotto興味を持っおあなたの論文を読みたした
arXivに珟れたした。 私はBIDSで䜕人かの友人を蚪ねおいたした、そしお圌らは持っおいたした
あなたの仕事に蚀及したした。 ディスカッションセクションでは、「これたでのずころ、
で怜出されるのに十分な倧きさの䞀貫したバむアスを持぀統蚈を芋぀けたした
MT19937のO10 ^ 5耇補」。もう1぀芋぀けたしたか
PCG64のような128ビット状態のPRNGの具䜓䟋は それは私には思えたす
この考慮事項が実甚的な関連性の合理的なしきい倀である
少なくずも遞択する目的で、他の人IMOを䞊回り始める可胜性がありたす
汎甚のデフォルト。

新しいPRNGフレヌムワヌク13163の優れた機胜
https://github.com/numpy/numpy/pull/13163は、誰でもできるずいうこずです
プラグむンするだけの独自のBitGeneratorを提䟛したす。
人々がnumpyコヌドでそれを䜿甚するには、numpyである必芁がありたす。 私は...するだろう
CでのBitGeneratorずしおのcryptorandomの実装を怜蚎するこずをお勧めしたす
そのため、他のオプションず盎接比范するこずができたす。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRO5PKW4MRFSBGUFUNTPXQUOLA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ABKTSRMRIHC4OYDR52HLTHDPXQUOLANCNFSM4HPX3CHA
。

たた、速床を気にするナヌザヌの「かなりの割合」がどれだけ倧きいのだろうか。 Python自䜓の平均はCよりも玄50倍遅いです。NumPyナヌザヌベヌスのどの郚分がPyPyでPythonを実行しおいたすか4倍の速床向䞊が埗られたす 確かにいく぀かありたすが、それほど倚くはないず思いたす。

あなたは通垞のナヌザヌではないず思いたすNumPyはほずんどCであり、Cで自分のこずをするのず同じくらい高速ですたあ、ほずんどの堎合高速です。 たた、PyPyは科孊的なアプリケヌションに察応した補品ではなく、いずれの堎合も䜎速ですNumPyが䜿甚するCPython APIの䜿甚に制限されおいるため、JITのメリットを享受できたせん。

いずれにせよ、これはトピックから倖れおいたす。 その速床の問題を䞻匵するこずは物議を醞すものではありたせん。

@imneme有界敎数にはlemiresメ゜ッドを䜿甚しおいたす。 これ以来
レガシヌや枛䟡償华のない新たなスタヌト
良いアルゎリズム。

月、2019幎5月27日には、19時46 imneme [email protected]は曞きたした

いく぀かのフォレンゞックずディスカッションに぀いおは、以䞋を参照しおください。
https://arxiv.org/pdf/1810.10985.pdf

教科曞は、PRNGができるこずを暗黙的たたは明瀺的に想定する方法を提䟛したす
材料を導入せずに真のIIDU [0,1倉数の代わりに䜿甚する
゚ラヌ[20、7、2、16、15]。 ここでは、この仮定が
MATLABを含む倚くの䞀般的に䜿甚される統蚈パッケヌゞのアルゎリズム
Pythonのランダムモゞュヌル、R、SPSS、およびStata。

FWIW、@ lemireによる玠敵な論文https://arxiv.org/abs/1805.10941がありたす
範囲内の数倀を効率的に生成するためのhttps://github.com/lemire
バむアスなし。 私はそれをいく぀かを探玢しお実行するための出発点ずしお䜿甚したした
私自身の蚘事のベンチマヌクも
http://www.pcg-random.org/posts/bounded-rands.html 。 生成する堎合
64ビット、Lemireの方法では、䜎速を回避するために128ビットの乗算を䜿甚したす
64ビット陀算、MSVCで発生する可胜性のあるすべおのよく知られた問題
ナヌザヌ。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRKNAQAK4WIXG5SVLO3PXQUA3A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ABKTSRKV3KYKRLNMBKNU4JLPXQUA3ANCNFSM4HPX3CHA
。

_safe_デフォルトを提䟛する必芁がありたす。珟圚の私の掚枬では、これは暗号化を陀くすべおの目的で安党なデフォルトを意味するずいうこずです。

それに぀いお議論するのは難しいです。 私の質問は-䜕が安党ですか さたざたなプロパティを持぀さたざたな皋床の準ランダム性がありたす。 これたでのずころ、具䜓的な䟋を挙げおいる人は誰もいたせん。ここでは、他の問題、PR、スレッドのいずれでもありたせん。 抜象的な統蚈的特性に぀いお話すだけでは圹に立ちたせん。

私の感芚では、PCG64が適切なデフォルトになるでしょう。 Windowsでの速床の䞍利な点は、Anacondaet。を䜿甚しおいる人々には明らかではありたせん。 al。、およびある時点で修正される可胜性がありたす。 䞊列実行はPythonの新しい機胜であるため、蚭定可胜なストリヌムを持぀こずも望たしいプロパティだず思いたす。

Visual StudioでのPCG64の速床ペナルティは、䞀掃できないものであるこずに非垞に懐疑的です。

これはどこかで泚意深く評䟡されたしたか

その速床の問題を䞻匵するこずは物議を醞すものではありたせん。

私の質問は-䜕が安党ですか

ロゞックを䞀貫しお適甚したす「䜕が速いか」 どのnumpyプログラムが実際にBitGeneratorのパフォヌマンスを重倧なボトルネックずしお持っおいるのか、私にはよくわかりたせん。 2倍の速床のBitGeneratorを䜿甚した堎合、完党な蚈算で5の速床向䞊が埗られたすか おそらくそれでもないでしょう。 Python-not-being-as-fast-as-Cは問題ではありたせん。 実際に圹立぀PRNGを倚甚するプログラムでさえ、 BitGenerator膚倧な時間を費やさないずいうだけです。 おそらく、利甚可胜な遞択肢のいずれかで十分です。

Visual StudioでのPCG64の速床ペナルティは、䞀掃できないものであるこずに非垞に懐疑的です。

アップスレッドclang PCG64をアセンブリにコンパむルしお64ビットMSVCを盗むこずができる方法を瀺したす。したがっお、64ビットWindows䞊のMSVCが克服できない問題であるずは思いたせん。

トリッキヌなのは、32ビットシステム䞊のPCG64ですが、32ビットWindowsだけがただ実際に重芁である可胜性がありたす。 その堎合、それは32ビットISAに制限するこずよりもMSVCに぀いおではありたせん。

@Kellie Ottoboni [email protected]ず私が指摘するのは、
適床なサむズの問題の堎合でも、MTの状態空間は小さすぎお近䌌できたせん
均䞀な順列n <2100たたは均䞀なランダムサンプルn = 4e8、k = 1000。

これは、ブヌトストラップから順列テスト、MCMCたですべおに圱響したす。
意図した分垃ず実際の分垃の違い
分垃は任意に倧きくするこずができたす総倉動距離が近づいおいたす
2。 それは倧きくお深刻です。

の「統蚈」関数でMTを砎る努力はしおいたせん。
数幎。 私はそれを砎る䜓系的な方法があるずかなり確信しおいたす
分垃距離が非垞に倧きいため。

也杯、
フィリップ

12時26分PMロバヌト・カヌンの月、2019幎5月27日には[email protected]
曞きたした

その速床の問題を䞻匵するこずは物議を醞すものではありたせん。

私の質問は-䜕が安党ですか

ロゞックを䞀貫しお適甚したす「䜕が速いか」 いい考えがない
どのnumpyプログラムが実際にBitGeneratorのパフォヌマンスを持っおいるか
重倧なボトルネック。 2倍の速床のBitGeneratorを䜿甚するず、
完党な蚈算で5のスピヌドアップが埗られたすか おそらくそれでもないでしょう。
Python-not-being-as-fast-as-Cは問題ではありたせん。 それだけです
実際に圹立぀PRNGを倚甚するプログラムは、倧量の費甚をかけたせん。
BitGeneratorでの時間。 おそらく利甚可胜な遞択肢のいずれかが
十分。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWKSMPAG3GFUCUFRXCDPXQYVRA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOOR
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AANFDWIDCPAJJ6DJ3RO332LPXQYVRANCNFSM4HPX3CHA
。

-
フィリップ・B・スタヌク| ア゜シ゚むトディヌン、数孊および物理科孊|
統蚈孊郚教授|
カリフォルニア倧孊
バヌクレヌ、カリフォルニア94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark

@pbstark私が芋たいのは、MTたたは128ビットPRNGが倱敗し、 cryptorandomが機胜する問題の具䜓的な実装です人為的である可胜性がありたすが、あたり工倫されおいたせん。 リサンプリング方法が128ビットPRNGで誀った掚論を行い、 cryptorandom正しい掚論を行うデヌタセットを指摘できたすか

PCG64に移行するず、問題のサむズの䞋限が悪化したす。
その状態空間はMTのそれよりもさらに小さいからです。 もちろん、それは可胜です
それでも、のサブグルヌプをサンプリングする可胜性があるずいう点で、「より良い」ランダム性を生成したす。
MTよりも均等に眮換矀。 しかし、それは前に故障しなければなりたせん
500は10を遞択し、21より前に。

也杯、
フィリップ

12:30ロバヌト・カヌンの月、2019幎5月27日には[email protected]
曞きたした

VisualStudioでのPCG64の速床ペナルティに非垞に懐疑的です
拭き取れないもの。

アップスレッドclangがPCG64をアセンブリにコンパむルしお盗むこずができる方法を瀺したす
64ビットMSVCの堎合、64ビットWindowsのMSVCは
乗り越えられない問題。

トリッキヌかもしれないのは、32ビットシステム䞊のPCG64で、そのうち32ビットのみです。
Windowsはただ私たちにずっお実際的に重芁かもしれたせん。 その堎合は少ないです
32ビットISAに制限するよりもMSVCに぀いおです。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWJFCINQCYGFCI7ULI3PXQZGLA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AANFDWK6QTB65Z4TJU76XKTPXQZGLANCNFSM4HPX3CHA
。

-
フィリップ・B・スタヌク| ア゜シ゚むトディヌン、数孊および物理科孊|
統蚈孊郚教授|
カリフォルニア倧孊
バヌクレヌ、カリフォルニア94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark

いずれにせよ、PRNGに぀いお十分に理解しおいないので、最初に統蚈的特性に焊点を圓おたいず思いたす答えがすべお非垞に優れおいる堎合は、問題ありたせん。 私が今疑問に思うこずの1぀は、k次元の同皋床分垃です。 珟圚、MTず比范しおここでうたく機胜するPCGなどのバリアントを䜿甚しおいたすか 非線圢ダむナミクスから来るので、少し緊匵したすが、PRNGの抂芁が十分になく、次の2日で理解できたせん...

最先端のパフォヌマンスを気にするWindows32ビットナヌザヌがたくさんいるずは思えたせん。 64ビットに切り替えるのにそれほど劎力はかかりたせん。

私も芋たいです。

私たちは、数孊に基づいお、倚くの倧きな問題があるに違いないこずを知っおいたす、
しかし、ただ䟋を瀺すこずはできたせん。

予防原則は、私たちが知っおいるので、
問題があり、それらを防ぐ方法CS-PRNGを知っおいる堎合は、
これはデフォルトであり、ナヌザヌがそうするこずを遞択した堎合は、ナヌザヌが慎重にならないようにしたす。

12:39ロバヌト・カヌンの月、2019幎5月27日には[email protected]
曞きたした

@pbstarkhttps //github.com/pbstark私が芋たいのは具䜓的なものです
問題の実装人為的である可胜性がありたすが、あたり工倫されおいたせん
どのMTたたは128ビットPRNGが倱敗し、cryptorandomが機胜するか。 あなたはできる
リサンプリング方法が間違っおいるデヌタセットを指摘する
128ビットPRNGによる掚論ずcryptorandomによる正しい掚論

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWODTUIPNMVOJB6QP3DPXQ2FPA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AANFDWITAGQFZDQSIFNEHETPXQ2FPANCNFSM4HPX3CHA
。

-
フィリップ・B・スタヌク| ア゜シ゚むトディヌン、数孊および物理科孊|
統蚈孊郚教授|
カリフォルニア倧孊
バヌクレヌ、カリフォルニア94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark

k-同皋床分垃定理は、党䜓にわたるPRNG出力のアンサンブルプロパティです。
PRNGの期間。 それは良いこずですが、他のこずに぀いおは䜕も蚀いたせん
出力のシリアル盞関など、ランダム性の倱敗の皮類。
それは比范的䜎いバヌです。

12:48セバスチャン・ベルクで月、2019幎5月27日には[email protected]
曞きたした

私はPRNGに぀いお十分に知らないので、いずれにせよ実際に重量を量るこずができたす。
最初に統蚈的特性に焊点を圓おる答えがそれである堎合
それらはすべお非垞に良いです、玠晎らしいです。 私が今疑問に思うこずの1぀は
k次元の同皋床分垃。 珟圚、PCGなどのバリアントを䜿甚しおいたすか
MTず比范しおここではうたくいきたすか 非線圢ダむナミクスから来お、それ
少し緊匵したすが、PRNGの抂芁が十分ではなく、
次の2日でそれを取埗したせん...

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWPOBTPYHC3XBINQYA3PXQ3HZA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AANFDWOEB7KR2YJZWHRRAHLPXQ3HZANCNFSM4HPX3CHA
。

-
フィリップ・B・スタヌク| ア゜シ゚むトディヌン、数孊および物理科孊|
統蚈孊郚教授|
カリフォルニア倧孊
バヌクレヌ、カリフォルニア94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark

@pbstark MTは、PCGおよび他のゞェネレヌタヌが合栌するいく぀かの統蚈的怜定に倱敗したす。

@rkern

MSVCでror呜什を生成したい堎合は、「_ rotr64」組み蟌み関数を䜿甚する必芁があるず思いたす。

たた、最適化のために「/ O2」フラグを奜むかもしれたせん。

それを芋るず、PCG64を䜿甚したい堎合は、アセンブリで䜜成するのが実際に最善かもしれたせん。

@pbstarkの堎合、未知のシヌドで初期化されたPCG-64からの出力を次に瀺したす実際、ストリヌムに぀いおも説明したす。 0x559107ab8002ccda3b8daf9dbe4ed480 。

  64bit: 0x21fdab3336e3627d 0x593e5ada8c20b97e 0x4c6dce7b21370ffc
     0xe78feafb1a3e4536 0x35a7d7bed633b42f 0x70147a46c2a396a0
  Coins: TTTHHTTTHHTHTTTTHTHHTTTTTHTTHHTTHHTHHTHHHHHHHHTTHHTTHHTHHHHHTHTHH
  Rolls: 5 3 5 2 5 3 1 6 6 5 4 4 5 5 5 6 2 3 5 3 2 3 2 5 6 2 4 6 2 3 4 6 3
  Cards: 5h 3h 3c 8d 9h 7s Kh Ah 5d Kc Tc 6h 7h 8s Ac 5c Ad Td 8c Qd 2h As
     8h 2d 3s 5s 4d 6d 2s Jd 3d 4h Ks 6s Qc Js Th 9d 9c Ts Jh 4c 2c 9s
     6c 4s 7c 7d Jc Qs Kd Qh

ここで、ランダムに遞択されたシヌドを䜿甚しお別のpcgゞェネレヌタヌを初期化するずしたす。 議論のために、 0xb124fedbf31ce435ff0151f8a07496d3遞びたしょう。 この既知の出力を怜出する前に、いく぀の出力を生成する必芁がありたすか 䞊で䜿甚したシヌドを知っおいるので、PCGの距離関数を介しお玄2.5×10 ^ 38たたは玄2 ^ 127.5の出力に答えるこずができたす。 参考たでに、10 ^ 38ナノ秒は宇宙の幎霢の2300億倍です。

したがっお、PCG-64には実際にそこにあるシヌケンスがありたすが、実際には、どこを芋ればよいかを教えない限り、実際にはそれを芋぀けるこずはできたせん。 そしお、ストリヌムを倉曎するず、さらに倚くの可胜性がありたす。

通垞のPCGでは、シェむクスピアプレむを出力する可胜性は実際にはれロです。 PCG拡匵生成スキヌムは、実際にはシェむクスピアプレむを出力できたすが、考案されおいないシナリオで出力される可胜性は非垞に小さいため、本質的にれロです。 私の目には、実際的な圱響がたったくないプロパティにはほずんど䟡倀がありたせん。

たた、暗号的に安党なPRNGは、k次元的に等分配されるこずが保蚌されおおらず、すべおの可胜なシヌケンスを生成できるPRNGが必芁な人にずっおは特効薬でもありたせん。PRNGから必芁なビット数よりも倚くのビットが必芁な瞬間シヌドしおその状態ずしお栌玍する堎合、生成できないビットシヌケンスが必然的にいく぀かありたす蚌明鳩の穎の原理による。たた、シヌドず同じ出力量に制限するず、䜕ができるのでしょうか。本圓に探しおいるのはハッシュ関数、たたはシヌド入力がPRNGではなく本圓にランダムである堎合はID関数だけです。

奜奇心から、 aesctr.hを䜿甚しおAESカりンタヌビットゞェネレヌタヌをラップしたした。時間はランダム倀あたりのns単䜍です。

+---------------------+--------------+----------+--------------+
|                     |   Xoshiro256 |    PCG64 |   AESCounter |
|---------------------+--------------+----------+--------------+
| 32-bit Unsigned Int |      3.40804 |  3.59984 |      5.2432  |
| Uniform             |      3.71296 |  4.372   |      4.93744 |
| 64-bit Unsigned Int |      3.97516 |  4.55628 |      5.76628 |
| Exponential         |      4.60288 |  5.63736 |      6.72288 |
| Normal              |      8.10372 | 10.1101  |     12.1082  |
+---------------------+--------------+----------+--------------+

よくできたした、@ bashtage。

芚えおおくべきいく぀かのこずは、特定のAES呜什はアヌキテクチャによっお異なり、アクティブに䜿甚されるすべおのCPUに存圚するわけではないため、遅いフォヌルバックパスが必芁であるずいうこずです。

たた、それは少しリンゎずオレンゞの比范です。 特殊な呜什を䜿甚するこずに加えお、AESコヌドはルヌプ展開からその速床のチャンクを取埗しおいたす—実際にはブロックで数倀を生成しおからそれらを読み取りたす。 展開するず、PRNGが高速化される可胜性がありたす。 FWIW、 @ lemireには、実際にはAVX呜什を䜿甚しお耇数の出力を䞀床に生成

少なくずも1぀のコンセンサスポむントを芁玄できるかどうかを芋おみたしょう。どのBitGeneratorアルゎリズムを䜿甚するかに぀いお、numpyが意芋を述べ、1぀のBitGeneratorを他のアルゎリズムよりも宣䌝する必芁があるこずに同意したす。

そのコンセンサスに䞀臎し、他のオプションのいく぀かが持぀可胜性のある問題のいく぀かを回避する「デフォルトなし」オプションをスケッチするこずをもう1぀突き刺しおください。 牜匕力がない堎合は、黙りたす。

「デフォルトなし」オプションが本圓に意味したのは、「匿名のデフォルトなし」でした。 シヌドされたGeneratorを取埗する最も䟿利な方法が、指定するPRNGに名前を付ける方法になるように、APIを蚭蚈する方法はただありたす。 たずえば、 BitGeneratorアルゎリズムの党範囲を_含たない_ずしたしょう。 numpyをかなり最小限に抑え、完成床をscipyやその他のサヌドパヌティラむブラリに任せるようにしおいたす。ここでそうするこずをお勧めしたす。 珟圚のアヌキテクチャの優れおいる点は、これらのBitGeneratorを他のラむブラリに移動できるこずです。 ぀たり、埓来のRandomStateず、人々が䜿甚するこずを奜む1぀のBitGeneratorをサポヌトするためにMT19937のみを提䟛するずしたす。 議論のために、それがXoshiro256だずしたしょう。 Generator.__init__()コンストラクタヌにBitGenerator必芁になるようにしたしょう。 しかし、たた、の関数を定矩しおみたしょうnp.random.xoshiro256_gen(seed)戻っおいるこずをGenerator(Xoshiro256(seed))カバヌの䞋に。 シヌドされたGeneratorを取埗する方法ずしお、その䟿利な機胜を文曞化したす。

ここで、いく぀かのリリヌスを早送りしたす。 PCG64 、 ThreeFryなどをrandom-tngたたはscipyたたはその他のパッケヌゞにプッシュし、そのうちの1぀が人気になったずしたす。远加機胜たたは新しい統蚈䞊の欠陥はXoshiro256たす。 どのBitGenerator人々が䜿甚すべきかに぀いおのnumpyの意芋をPCG64に曎新するこずにしたした。 次に、 PCG64 BitGeneratorクラスを远加し、 np.random.pcg64_gen(seed)関数を远加したす。 np.random.xoshiro256_gen(seed)に非掚奚の譊告を远加しお、掚奚されるアルゎリズムではなくなったこずを瀺したす。新しいコヌドではnp.random.pcg64_gen(seed)を䜿甚するこずをお勧めしたすが、 Xoshiro256アルゎリズムを䜿甚せずに匕き続き䜿甚するこずをお勧めしたす。譊告、明瀺的にGenerator(Xoshiro256(seed))䜿甚する必芁がありたす。

これにより、「匿名」APIで発生する問題の䞀郚぀たり、 Generator(seed) 、 Generator(DefaultBitGenerator(seed)) 、 np.random.default_gen(seed) を回避できるず思いたす。 もはや優先されなくなったアルゎリズムを氞続的にサポヌトできたす。 意芋を倉曎するずきに、意芋のある「優先」コンストラクタヌに別のこずをさせる必芁はありたせん。 バヌゞョン番号ではなく本名を䜿甚しお区別するため、コヌドを曎新しお叀い結果を再珟する方法を垞に知っおいたす䜕らかの理由で無害な譊告に耐えられない堎合。 出所のないコヌドや蚘録されたnumpyのリリヌス番号を取埗しお、その曎新を行うこずもできたす。 同時に、アルゎリズムの数を最小限に抑え、ラむブラリを操䜜するための最も簡単な方法をベストプラクティスにするこずで、numpyの意芋を効果的に衚珟するこずができたす。

それはどのように聞こえたすか 最初のリリヌスでは、そのBitGeneratorを確実に遞択するためにただ倚くの努力を払う必芁がありたす。 それはただ重芁です。

最先端のパフォヌマンスを気にするWindows32ビットナヌザヌがたくさんいるずは思えたせん。 64ビットに切り替えるのにそれほど劎力はかかりたせん。

同意する。 Win32でのPCG64の問題は単にパフォヌマンスそしおおそらくある皋床の努力で改善できる問題であるため、それがブロッカヌではないこずに同意したすか

MSVCでror呜什を生成したい堎合は、「_ rotr64」組み蟌み関数を䜿甚する必芁があるず思いたす。

たた、最適化のために「/ O2」フラグを奜むかもしれたせん。

ありがずう @imnemeは私のためにこれらすべおの倱敗を指摘したした。 :-)

@seberg譊戒心に぀ながった、あなたの分野からの匕甚はありたすか たずえば、MT19937のk = 623の同皋床分垃定理が、より小さなPRNGが匕き起こす非線圢ダむナミクスシミュレヌションの問題を修正したこずを瀺した論文ですか それを参考にしお、より具䜓的な保蚌を提䟛できるかもしれたせん。 _䞀般_では、同皋床分垃定理に関する私の芋解は、䞀般に、PRNGの同皋床分垃をPRNGの状態サむズで蚱可されおいる最倧倀に近づけたいずいうものです。 _practice_で、PRNGが他の点で目的に十分な倧きさである堎合PractRandを通過する、描画する予定のサンプル数の2乗よりも呚期が倧きいなど、心配する理由はあたりありたせん。正確なk 。 他の人は異なる意芋を持っおいるかもしれたせん、そしお倚分あなたの分野で私が知らない特定の問題があるかもしれたせん。 その堎合は、利甚可胜な特定の゜リュヌションがありたす

奜奇心から、 aesctr.hを䜿甚しおAESカりンタヌビットゞェネレヌタヌをラップしたした

私は間違っおいる可胜性がありたすが、これが@pbstarkの懞念に圹立぀ずは思いたせん。 AES-CTRはCS-RNGですが、すべおのCS-RNGに、かなりのkすべおの可胜なk!順列に理論的に到達できるようにするために必芁な長い期間があるわけではありたせん。 カりンタヌはただ128ビットの数倀であり、ロヌルオヌバヌするず、期間の終わりに到達したす。 @pbstarkは、非垞に倧芏暡な

䞀般に、同皋床分垃定理に関する私の芋解は、PRNGの同皋床分垃を、PRNGの状態サむズで蚱可されおいる最倧倀に近づけたいずいうものです。

最倧の同皋床分垃が望たしい特性であるず考える人もいたすが、それは欠陥ず芋なすこずもできたすそしお、倚くのこずを述べおいる論文がそこにありたす。 _k_-bit PRNGがあり、すべおの_k_-bitシヌケンスが1回だけ発生する堎合、誕生日の問題に違反するこずになりたす。これは、玄2 ^k / 2の出力埌に出力が繰り返されるず予想されるこずを瀺しおいたす。 私はこれらのアむデアに基づいお誕生日の問題の統蚈的怜定を䜜成したした。64ビット出力の64ビット状態のPRNGであるSplitMixず32ビット出力の64ビットのXoroshiro64 +で、統蚈的に劥圓でない繰り返しがないこずを正しく怜出し

興味深いこずに、64ビットの繰り返しがないたたは繰り返しが倚すぎる-ポア゜ン分垃が予想されるためにPRNGに倱敗する統蚈的怜定を䜜成するこずは非垞に実甚的ですが、逆に、省略されおいる倀がわからない堎合は、すべおの64ビット倀の36.8の省略を怜出したす。

明らかに、_k_が倧きくなるに぀れお、期埅されない繰り返しの欠陥をテストするこずは実甚的ではなくなりたすが、状態のサむズおよび期間が倧きくなるに぀れお、サむズが远加されるこずは、それを瀺すこずの䞡方が実甚的でないこずを意味したす。最倧に等分配されたPRNGは、繰り返しに倱敗したために欠陥があり、同様に非実甚的であり、非最倧に等分配されたPRNGは、いく぀かの_k_ビットシヌケンスを繰り返し統蚈的にもっずもらしい方法で、他のシヌケンスを完党に省略したために欠陥がありたす。 どちらの堎合も、PRNGは倧きすぎお、2぀を区別できたせん。

私も芋たいです。 私たちは、数孊に基づいお、倚くの倧きな問題があるに違いないこずを知っおいたすが、ただ䟋を瀺すこずはできたせん。 予防原則は、倧きな問題があるこずを知っおおり、それらを防ぐ方法CS-PRNGを知っおいるので、デフォルトでそれを実行し、ナヌザヌが遞択した堎合に泚意を払わないようにするこずもできたす。

私はこの議論ず蚌拠に玍埗しおいないず蚀わざるを埗たせん。 そのため、Numpyナヌザヌの前に立぀のは気が進たないので、この理由で切り替える必芁があるず䌝えたす。 私はこの声明を擁護する準備ができおいないので、これらの䟋を求めおいたす。 それらは説埗力があり、あなたが私たちに勧めおいるこの立堎を擁護する準備をしおくれるでしょう。

有限のPRNGが真のRNGに達しない特性はたくさんありたす。 そしお、理論的には、真のRNGのプロパティに䟝存しお実行したい蚈算がたくさんありたすたたは、少なくずも、それらをどれだけ緩和できるかを厳密に蚌明しおいたせん。 しかし、これらの欠点の倚くは、実行する実際の蚈算の結果に、ごくわずかで、実際には目立たない圱響しか䞎えたせん。 これらの違反は、吊定的なものではなく、オヌルオアナッシング、ゎヌ/ノヌゎヌのようなものです。 それらには効果量があり、私たちは倚かれ少なかれ効果を蚱容するこずができたす。

もちろん、説埗力のあるこずに、特定のサむズのPRNGは、䞀郚のkに察しおすべおのk!順列を均等に生成できないこずを瀺しおいたす。 私が芋逃しおいるステップは、これらの順列をすべお生成できないこずが、実行したい具䜓的な蚈算にどのように圱響するかずいうこずです。 PractRandたたはTestU01に远加しお、問題を人​​々に瀺すこずをお勧めするテストがありたせん。

@imnemeのPCGペヌパヌから非垞に有益であるこずがわかった分析ラむンの1぀は、各PRNGの耇数のより小さな状態のバヌゞョンを導き出し、それらがTestU01に倱敗し始めた堎所を正確に確認するこずでした。 これにより、「X PRNGが合栌」たたは「倱敗」ず蚀うだけでなく、PRNGアヌキテクチャを通垞比范する方法が埗られたす。 たた、䜿甚䞭の状態サむズ倚数のGiBのサンプルでTestU01に合栌でのヘッドルヌムの量を芋積もるこずができたす。 8ビットPRNGの問題を実蚌するために実行できる具䜓的な蚈算はありたすか 16ビットPRNG 次に、この新しいテストで、TestU01 / PractRandが珟圚行うよりも早くPRNGに関する情報が埗られるかどうかを確認できたす。 そしお、それは非垞に圹に立ちたす。

䞀方、PractRandの珟圚の䞀連のテストの小さなPRNGの障害点よりも、これらの順列に基づいお障害を瀺すためにPRNGから匕き出されたデヌタが必芁な堎合、この問題は実甚的ではないず結論付けたす。懞念事項であり、順列の問題が私の蚈算に実際的な圱響を䞎えるかどうかの適切なプロキシずしお「passesPractRand」を䜿甚できたす。

しかし、実行しお問題を人々に瀺すこずができるプログラムが手元にあるたで、これに基づいおCS-PRNGを掚進するこずに抵抗がありたす。 私はその遞択を説埗力を持っお説明するこずはできたせん。

32アむテムをシャッフルするずきにそれを芁求する人のために、すべお32 シャッフル぀たり、それらのすべおの263130836933693530167218012160000000は、それらの32からのランダムサンプルのみを提䟛するPRNGではなく、生成可胜である必芁がありたす。 シャッフル、私は実際にあなたが膚倧な数を芁求しようずしおいるなら、あなたはただ十分に倧きく考えおいないだけだず蚀うでしょう。

したがっお、私は顔を合わせおそれらのシャッフルが出おくる順序も事前に決定されるべきではないず䞻匵したす 明らかに、32個すべおを出力するように芁求する必芁がありたす。 可胜なすべおの順序でシャッフルしたす—32 必芁なものです もちろん、これには状態に3.8×10 ^ 18゚クサバむトが必芁であり、初期化するには同様の量の゚ントロピヌが必芁ですが、すべおがそこにあるこずを知っおおく䟡倀は確かにありたす。

... np.random.xoshiro256_gen(seed)に非掚奚の譊告を远加しお、掚奚されるアルゎリズムではなくなったこずを瀺したす。新しいコヌドではnp.random.pcg64_gen(seed)を䜿甚するこずをお勧めしたすが、譊告なしでXoshiro256アルゎリズムを匕き続き䜿甚するこずをお勧めしたす。明瀺的にGenerator(Xoshiro256(seed))䜿甚する必芁がありたす

それでも、非掚奚ず、本圓に知りたくない奇劙な名前の䞡方でナヌザヌを悩たせおいたす。

NEPは次のように述べおいたす。

デフォルトを曎新する十分な理由がある堎合は、それを実行しお、アルゎリズムを明瀺的に指定しなかったナヌザヌのビットごずの再珟性を壊すこずが、より良いオプションですそしおあなたが以前に䞻匵しおいたもの。

「デフォルトなし」オプションが本圓に意味したのは、「匿名のデフォルトなし」でした。

では、ナヌザヌが䜿甚しおいるPRNGの名前を知りたいずいうのはあなたのポむントですか

これをナヌザヌの芳点から芋おください。 それらをnp.random.rand coからnp.random.RandomState()から、メ゜ッドを䜿甚するのは十分に困難です。 今床はより良いシステムを玹介したす。圌らが目にするのはnp.random.xoshiro256_gen()ですか これは、䜿いやすさの点で倧きな回垰になりたす。

では、ナヌザヌが䜿甚しおいるPRNGの名前を知りたいずいうのはあなたのポむントですか

いいえ、それは人々が回避しおいたdefault_generator(seed)ような「指定された移動タヌゲット」APIを持぀問題を軜枛するこずですたずえば、 @ shoyerのversion匕数。

ストリヌムの互換性を維持するこずNEP 19はこれを吊認したすは、APIの砎損の二次的なものです。 異なるBitGeneratorは、機胜セットに応じお異なる有効なAPIを持ちたす䞻に、蚭定可胜なストリヌム、ゞャンプアヘッドですが、PRNGのパラメヌタヌ化の皋床に応じお、他のAPIもありたす。 したがっお、デフォルトのPRNG遞択を倉曎するず、出力される倀を倉曎するだけでなく、実際にコヌドが砎損したす぀たり、実行されなくなったり、正しく実行されなくなったりしたす。

たずえば、最初にPCG64たす。 128ビットの状態、2 ^ 127の蚭定可胜なストリヌムがあり、ゞャンプアヘッドを実装したす。 玠晎らしく、フル機胜。 したがっお、人々はdefault_generator(seed, stream=whatever)曞き始めたす。 さお、将来の䜜業で、他の䜕かに切り替えたくなるような倧きな統蚈䞊の欠陥が芋぀かったずしたしょう。 デフォルトずしおプロモヌトする次のPRNGは、128ビット以䞊の状態簡単です。汎甚のデフォルトずしおこれよりも小さいものはお勧めしたせん、ゞャンプアヘッドハヌド、> = 2 ^ 127の蚭定可胜なストリヌムwhoo、少幎、コヌドにすでに存圚するdefault_generator()の䜿甚を壊さないために。 今、私たちはそのラチェットず䞀緒に暮らすこずができるかもしれたせん。

@shoyerは、デフォルトのBitGenerator垞に意図的に最小公分母の機胜に限定するこずができるかもしれないず提案したした。 それはうたくいくでしょう しかし、 @ charrisが

今床はより良いシステムを玹介したす。圌らが目にするのはnp.random.xoshiro256_gen()ですか これは、䜿いやすさの点で倧きな回垰になりたす。

奇劙な名前が問題である堎合は、ポリシヌが同じである限り、よりわかりやすい䞀般的な名前を䜿甚できたす新しい関数を远加し、叀い関数に぀いお譊告を開始したす。 私はそれず同等だず思いたす。 これを頻繁に行うべきではありたせん。

ラチェットを䜿甚しおversionメカニズムを回避するこずにした堎合も、問題ありたせん。

「デフォルト」に぀いおの私の芋解は、 Generator()が垞に機胜するように、実装の詳现ずしお残すこずができるずいうものです。 垞に再珟可胜な結果ゞェネレヌタヌの倉曎たでを取埗する唯䞀の方法は、構文Generator(BitGenerator(kwarg1=1,kwargs2=b,...))を䜿甚するこずであるこずに泚意しお、これを理解したす。

状態ぞのアクセスにはピクルスが必芁であるため、実装の詳现を実際に非衚瀺にするこずは実甚的ではありたせん。

別の方法は、他の関数ず同じように扱い、䞀般にランダム生成を行い、倉曎が必芁な堎合は暙準の非掚奚サむクルを実行するこずです。 これは、物事を正しく行うナヌザヌに圱響を䞎えるこずはありたせん。ドキュメントに十分な譊告があれば、少なくずも倧芏暡なプロゞェクトでは、これに察しお適切なヒット率を埗るこずができる可胜性がありたす。 ここで私が提案しおいるのは、新しいAPIに぀いお考えるずきに、ストリヌムの互換性の保蚌が行われたこずを忘れるこずができるずいうこずです。

13650で@bashtageは、私がアクセス犁止Generator().bit_generatorただぞの盎接アクセスがないず酞掗こずができたすようにstate 。 わずかに曞き盎されたtest_pickleを、Python Thread党䜓で䜿甚できるように枡したす。

私の質問は-䜕が安党ですか さたざたなプロパティを持぀さたざたな皋床の準ランダム性がありたす。 これたでのずころ、具䜓的な䟋を挙げおいる人は誰もいたせん。ここでは、他の問題、PR、スレッドのいずれでもありたせん。

䞀郚の_N_ 512、1024の「

アルゎリズムの序数ランキングを可胜にする統蚈品質のより掗緎されたビュヌが必芁な堎合は、 @ imnemeのPCGペヌパヌのセクション3をお勧めしたす。このペヌパヌでは、アルゎリズムの瞮小状態バリアントのプロファむルを䜿甚しお、その方法を理解しおいたす。各完党なアルゎリズムには倚くの「ヘッドルヌム」がありたす。 これは、暗号技術者がさたざたな暗号アルゎリズムを分析する方法ず非垞によく䌌おいたす。 怜蚎䞭の実行可胜なオプションは、「壊れおいない」ずいうベヌスラむン基準に合栌する必芁がありたすが、これは候補者のランク付けには圹立ちたせん。 代わりに、圌らは競合アルゎリズムの瞮小バヌゞョンを構築し、それを砎る前にあなたがどれだけ削枛しなければならないかを確認したす。 Nラりンドの完党アルゎリズムがN-1で砎られた堎合、ヘッドルヌムはほずんどなく、暗号孊者はおそらくそれを回避するでしょう。 同様に、128ビットのBitGeneratorがPractRandを通過したが、その120ビットバヌゞョンが倱敗した堎合、おそらくかなり危険です。

@mattipそれは合理的なようです。 どこかで誰かが

import gc
state = [o for o in gc.get_objects() if 'Xoshiro256' in str(o)][0].state

圌らがそれを深く掘り䞋げたいのなら、それは問題ありたせん。 専門家以倖のナヌザヌを支揎したいだけです

わずかに曞き盎されたtest_pickleを、Python Thread党䜓で䜿甚できるように枡したす。

これは未解決の問題9650であるこずに泚意しおください。理想的には、 Generator()が子スレッドに再シヌドされたす。 IIRCこれはPython> = 3.7でのみ実甚的です

「デフォルト」に぀いおの私の芋解は、 Generator()が垞に機胜するように、実装の詳现ずしお残すこずができるずいうものです。 垞に再珟可胜な結果ゞェネレヌタヌの倉曎たでを取埗する唯䞀の方法は、構文Generator(BitGenerator(kwarg1=1,kwargs2=b,...))を䜿甚するこずであるこずに泚意しお、これを理解したす。

区別する必芁のある再珟性には2皮類ありたす。 1぀は、同じシヌドを䜿甚しおプログラムを2回実行し、同じ結果が埗られるこずです。 それが私たちがサポヌトする必芁があるものです。 もう1぀は、少なくずも厳密な意味で、私たちが吊認したnumpyのバヌゞョン間での再珟性です。

匕数のないGenerator() 、぀たり「numpyが掚奚する任意にシヌドされたPRNGを教えおください」は䞻な䜿甚䟋ではありたせん。 倚くのサポヌトは必芁ありたせん。 「numpyが_this_seedで掚奚するPRNGを教えおください」は、オプションに぀いお説明しおいるものです。 シヌドされたPRNGを取埗する方法に぀いお、numpyが意芋を衚明する方法が必芁です。その方法は、ナヌザヌにずっお簡単で䟿利である必芁がありたすそうでない堎合、ナヌザヌは䜿甚したせん。 私はアルゎリズムに名前を付けるのが奜きですがより䟿利な関数を䜿甚したすが、 @ rgommersはそれが䞀歩遠すぎるず考えおおり、私はそれに同情しおいたす。

匕数のないGenerator、぀たり「numpyが掚奚する任意にシヌドされたPRNGを教えおください」は䞻なナヌスケヌスではありたせん。 倚くのサポヌトは必芁ありたせん。 「numpyがこのシヌドで掚奚するPRNGを教えおください」は、オプションに぀いお話し合っおいるものです。 シヌドされたPRNGを取埗する方法に぀いお、numpyが意芋を衚明する方法が必芁です。その方法は、ナヌザヌにずっお簡単で䟿利である必芁がありたすそうでない堎合、ナヌザヌは䜿甚したせん。 私はアルゎリズムに名前を付けるのが奜きですがより䟿利な関数を䜿甚したすが、 @ rgommersはそれが䞀歩遠すぎるず考えおおり、私はそれに同情しおいたす。

私は、ナヌザヌが実際に良いシヌドを提䟛するための蚭備が敎っおいないず䞻匵したす。 たずえば、メルセンヌツむスタヌをシヌドする正しい方法を知っおいるナヌザヌは䜕人いたすか 思ったほど簡単ではありたせん。624個のランダムな32ビット敎数19937ビットの状態を提䟛するためを䟛絊しおいない堎合は、間違っおいたす。

したがっお、実際には、ナヌザヌが再珟可胜な結果を​​埗る正しい方法は、PRNGを䜜成しシヌドを提䟛せずに、自動的に適切にシヌドされるようにする、それをピクルスにするこずです。

議論が正しい方法に぀いおのみである堎合、私は
Generator(BitGenerator(**kwargs))これはによっおのみ䜿甚されるため
耇補を気にする半意識のナヌザヌ。

Generator()䜿甚されるデフォルト
考慮された遞択ず同じくらい倚く解釈されるので、それを
シヌドされたフォヌムを䜿甚する堎合の掚奚事項。

もう1぀捚おるだけで、クラスメ゜ッドGenerator.seeded(seed[, bit_generator]) where bit generator is a string. This would allow the pattern of switching from one value to None to warn if the default was going to change, like lstsq. I would also only support a limited pallatte of but generators initially (i.e. 1). Doesn't make it easy to expose advanced features I suppose. In a perfect world it would use kwarg only to allow any keyword argument to be used which avoids most depreciation problems. Of course, this doesn't really need to be a class function, just seed`。

火、2019幎5月28日には、午埌4時38分ロバヌト・カヌンの[email protected]は曞きたした

「デフォルト」に぀いおの私の芋解は、それを実装ずしお残すこずができるずいうこずです
詳现、Generatorが垞に機胜するようにしたす。 私はこれを
垞に再珟可胜な結果を​​埗る唯䞀の方法であるこずに泚意しおください。
ゞェネレヌタヌの倉曎たで構文を䜿甚するこずです
GeneratorBitGeneratorkwarg1 = 1、kwargs2 = b、...

区別する必芁のある再珟性には2皮類ありたす。 1぀は
同じシヌドでプログラムを2回実行するず、同じ結果が埗られたす。
それが私たちがサポヌトする必芁があるものです。 もう1぀は、党䜓の再珟性です。
少なくずも厳密な意味で、私たちが吊認したnumpyのバヌゞョン。

匕数のないGenerator、぀たり「任意にシヌドされたPRNGを
numpyが掚奚する」は䞻なナヌスケヌスではありたせん。それほど倚くは必芁ありたせん。
サポヌト。 「numpyがこのシヌドで掚奚するPRNGを教えおください」は、
そしお、それが私たちがオプションに぀いお議論しおいるものです。 numpyがする方法が必芁です
シヌドされたPRNGを取埗する方法に぀いお意芋を衚明し、その方法は
ナヌザヌにずっお簡単で䟿利ですそうでなければ、ナヌザヌはそれを䜿甚したせん。 私は奜きです
アルゎリズムに名前を付けたすより䟿利な関数を䜿甚したすがが、
@rgommers https://github.com/rgommersは、それは䞀歩遠すぎるず考えおおり、
私はそれに同情しおいたす。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRKA4SSNW6XZEVFUMCDPXVGW5A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ABKTSROCMLHG6E6BLWI6TWDPXVGW5ANCNFSM4HPX3CHA
。

火、2019幎5月28日には、午埌4時38分ロバヌト・カヌンの[email protected]は曞きたした

「デフォルト」に぀いおの私の芋解は、それを実装ずしお残すこずができるずいうこずです
詳现、Generatorが垞に機胜するようにしたす。 私はこれを
垞に再珟可胜な結果を​​埗る唯䞀の方法であるこずに泚意しおください。
ゞェネレヌタヌの倉曎たで構文を䜿甚するこずです
GeneratorBitGeneratorkwarg1 = 1、kwargs2 = b、...

区別する必芁のある再珟性には2皮類ありたす。 1぀は
同じシヌドでプログラムを2回実行するず、同じ結果が埗られたす。
それが私たちがサポヌトする必芁があるものです。 もう1぀は、党䜓の再珟性です。
少なくずも厳密な意味で、私たちが吊認したnumpyのバヌゞョン。

匕数のないGenerator、぀たり「任意にシヌドされたPRNGを
numpyが掚奚する」は䞻なナヌスケヌスではありたせん。それほど倚くは必芁ありたせん。
サポヌト。 「numpyがこのシヌドで掚奚するPRNGを教えおください」は、
そしお、それが私たちがオプションに぀いお議論しおいるものです。 numpyがする方法が必芁です
シヌドされたPRNGを取埗する方法に぀いお意芋を衚明し、その方法は
ナヌザヌにずっお簡単で䟿利ですそうでなければ、ナヌザヌはそれを䜿甚したせん。 私は奜きです
アルゎリズムに名前を付けたすより䟿利な関数を䜿甚したすがが、
@rgommers https://github.com/rgommersは、それは䞀歩遠すぎるず考えおおり、
私はそれに同情しおいたす。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=ABKTSRKA4SSNW6XZEVFUMCDPXVGW5A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ABKTSROCMLHG6E6BLWI6TWDPXVGW5ANCNFSM4HPX3CHA
。

䜿いやすさの芳点から、私たちは本圓にGenerator(seed)をサポヌトする必芁があるず思いたす。 そうでなければ、圌らがする準備ができおいない遞択をするこずに盎面しお、ナヌザヌはただRandomStateに固執するでしょう。

Generatorでデフォルトのビットゞェネレヌタヌをバヌゞョン管理するには、 version=1代わりにbit_version=1䜿甚できたすが、 versionアむデアを削陀しおも問題ありたせん。 ナヌザヌがビットゞェネレヌタを明瀺的に蚭定する必芁はあたりないず思いたす。

特定のゞェネレヌタヌ機胜を必芁ずする特定のナヌスケヌスを解決するための私の奜みは、実装の詳现を隠す新しい汎甚BitG​​eneratorAPIを蚭蚈するこずです。 これらは、 DefaultBitGenerator远加するか、䜿甚にトレヌドオフが含たれる堎合は新しいクラスに入れるこずができたす䟋 ParallelBitGenerator 。

デフォルトのビットゞェネレヌタヌの倉曎によるRNGストリヌムの将来の倉曎に関する譊告は絶察に避けたいず思いたす。 これらの譊告は、そのような詳现に䟝存しないが、乱数が自発的に倉化するのを防ぐためだけにゞェネレヌタヌにseedを蚭定する倧倚数のナヌザヌにずっおは単なるノむズです。

ナヌザヌはRandomStateに固執するだけです。

それは問題ありたせん、圌らはアヌリヌアダプタヌではありたせん。 APIはい぀でも拡倧できたすが、瞮小するのははるかに難しいため、実行可胜な最小限のAPIを匷く求めおいたす倚分難しすぎたすか。 Generator(Philox()) 、 Generator(seed(3)) 、 Generator(bit_version=1)間のニュアンスは、これが゚ンドナヌザヌに䌝わるたで少しわかりにくいです。

Generator(seed)ない最初のバヌゞョンを入手しお、フィヌドバックを受け取りたしょう。

Generator(seed)ない最初のバヌゞョンを入手しお、フィヌドバックを受け取りたしょう。

OK、ここでは深刻な異議はありたせん。 その堎合、今のずころ完党なBitGeneratorを指定する必芁があるかもしれたせん。

したがっお、実際には、ナヌザヌが再珟可胜な結果を​​埗る正しい方法は、PRNGを䜜成しシヌドを提䟛せずに、自動的に適切にシヌドされるようにする、それをピクルスにするこずです。

私は同じこずを蚀いたすが、私はそれでほずんど牜匕力を埗たせん。 あなたが蚀うように、「たあ、䜕かが悪い考えだからずいっお、人々がそれをやりたくないずいう意味ではありたせん」

問題の䞀郚は、MTの巚倧な状態によっお悪化したす。これは、実際にはファむルぞのシリアル化を必芁ずしたす。 そのファむルベヌスのダンスを、ナヌザヌが䜿いたくなるような最も簡単なAPIにするのは難しいです。 状態がはるかに小さいデフォルトのPRNGを䜿甚するず、状況は改善されたす。 128ビットはUUIDのサむズであり、16進数で印刷しおコピヌアンドペヌストするのに十分小さいサむズです。 したがっお、適切なパタヌンは、デフォルトで適切な゚ントロピヌシヌドになるようにプログラムを蚘述し、次にプログラムを実行するずきにコピヌしお貌り付けるこずができるようにその状態を出力するこずです。

❯ python secret_prng.py
Seed: 0x977918d0c7da45e5168f72005586500c
...
Result = 0.7223650399276123

❯ python secret_prng.py
Seed: 0xe8962534e5fb585483b86119fcb852ce
...
Result = 0.10640984721018876

❯ python secret_prng.py --seed 0xe8962534e5fb585483b86119fcb852ce
Seed: 0xe8962534e5fb585483b86119fcb852ce
...
Result = 0.10640984721018876

このようなパタヌンが単玔さず将来の蚌拠の䞡方を提䟛するかどうかはわかりたせん。

NumPy 1.next

class Generator:
    def __init__(bitgen_or_seed=None, *, bit_generator='pcg64', inc=0):

NumPy 1.20.x

`` `python
クラスゞェネレヌタ
def __init __bitgen_or_seed = None、*、bit_generator = None、inc = None
bit_generatorがNoneでない堎合、たたはincがNoneでない堎合
warn 'デフォルトはPCG64からAESCtrに倉曎されおいたす。incキヌワヌド'
「議論は非掚奚であり、将来的に提起されるでしょう」、FutureWarning
「」

NumPy 1.22

`` `python
クラスゞェネレヌタ
def __init __bitgen_or_seed = None、*、bit_generator = 'aesctr'、inc = None、counter = 0
bit_generator == 'pcg64'たたはincがNoneでない堎合
䟋倖を発生させたす 'PCGはサポヌトされなくなり、incは削陀されたした'
「」

このようなパタヌンが単玔さず将来の蚌拠の䞡方を提䟛するかどうかはわかりたせん。

䞊蚘のhttps://github.com/numpy/numpy/issues/13635#issuecomment-496589421で述べたように、これはほずんどのナヌザヌにずっお驚くべきこずであり、苛立たしいこずだず思いたす。 ナヌザヌがすべおのオプションの匕数を蚭定しおいない堎合に譊告の発行を開始する蚈画よりも、明瀺的なBitGeneratorオブゞェクトを提䟛する必芁がありたす。 APIが予期しない方法で壊れおいるこずがわかった堎合、これは本圓に最埌の手段になるはずです。

問題は移行期間です。 デフォルトを䜿甚しおいるすべおの人が突然譊告を受け取り、移行期間䞭に切り替えるための優れた方法がありたせん。 あるいは、少なくずも、あなたはの「䜎゚ネルギヌ状態」からそれらを移動Generator(seed)の少ない䟿利な「高゚ネルギヌ状態」にGenerator(seed, bit_generator='aesctr') 。 このAPIの目的は䟿利な「䜎゚ネルギヌ状態」を提䟛するこずであったため、この移行䞭に目的を達成できたせんでした。 ヒストグラム関数の1぀であるIIRCを䜿甚しおこれを䞀床実行したしたが、これは悪倢でした。

これは、匕数の意味をむンプレヌスで倉曎しようずするすべおの非掚奚に共通です。 ある機胜から別の機胜に移動するずいう非掚奚は、管理がはるかに簡単であり、それが私が提唱しおいたこずです。

Generator(seed)ない最初のバヌゞョンを入手しお、フィヌドバックを受け取りたしょう。

「最初のバヌゞョン」ずは、完党なnumpyリリヌスを意味したすか それずも、PRをマヌゞするだけですかそれ以降に発生したした

完党なnumpyリリヌスの堎合、含めるBitGeneratorの数など、ただ決定すべきこずがいく぀かありたす。 珟圚の完党な補数を含める堎合は、いく぀かのオプションを開瀺しおいたす。

ある機胜から別の機胜に移動するずいう非掚奚は、管理がはるかに簡単であり、それが私が提唱しおいたこずです。

+1同意

いいえ、それは、人々が回避しおいたdefault_generatorseedのような「指定された移動タヌゲット」APIを持぀問題を軜枛するこずですたずえば、 @ shoyerのバヌゞョン匕数。

ストリヌムの互換性を維持するこずNEP 19はこれを吊認したすは、APIの砎損の二次的なものです。 異なるBitGeneratorは異なる効果的なAPIを持っおいたす

ああ、今ではもっず理にかなっおいたす。

奇劙な名前が問題である堎合は、ポリシヌが同じである限り、よりわかりやすい䞀般的な名前を䜿甚できたす新しい関数を远加し、叀い関数に぀いお譊告を開始したす。 私はそれず同等だず思いたす。 これを頻繁に行うべきではありたせん。

これは、これたでのずころ最善の解決策のように思えたす。 ここで正しい名前を遞択できるはずです。 そしお、他の正気の名前の倧きなスペヌスがありたす-私たちがおそらく決しお必芁ずしないでしょう。

np.random.generatorやnp.random.default_generator 。

含めるBitGeneratorの数

珟圚含たれおいるものMT19937、DSFMT、PCG32、PCG64、Philox、ThreeFry、Xoshiro256、Xoshiro512から削陀する必芁があるず思われるものを削陀する提案で別の問題を開くこずができたすか

ここではただ問題を解決しおいたせん。どのBitGeneratorをデフォルトにする必芁がありたすか珟圚はXoshiro256 

さお、この問題は、「どれを区別されたBitGeneratorずしお宣䌝する必芁があるか」に関するものであり、デフォルトの遞択に圱響したすが、どの問題を含めるか削陀する必芁もありたす。 デフォルトを提䟛するメカニズムデフォルトを提䟛する堎合はいく぀かの制玄を远加するため、これらはすべお、倚かれ少なかれ䞀緒に決定する必芁があるものです。 それは倧きな厄介な問題であり、このPRをシェパヌディングするために行ったすべおの䜜業の埌、誰もコヌドを提䟛しおいない別のメガスレッドを芋るのに疲れおいるず確信しおいるので、お芋舞い申し䞊げたす。 :-)

アルゎリズム自䜓に関する限り、私はすでに掚奚事項を瀺しおいたす。 RandomStateず比范のためにMT19937を保持する必芁があり、掚奚目的のためにPCG64奜きです。

私はCompilerExplorerを少しいじりたしたが、組み蟌み関数を䜿甚しお64ビットMSVC甚のPCG64を実装し、コンパむラヌにclangのuint128_t数孊に近いアセンブリを生成させるようにしたず思いたすhttps// godbolt .org / z / ZnPd7Z

珟圚、Windows開発環境がセットアップされおいないので、実際に_正しい_かどうかはわかりたせん... @ bashtageこれを詊しおみたせんか

パッチなし

Uniforms per second
************************************************************
PCG64            62.77 million

パッチ付き

Uniforms per second
************************************************************
PCG64           154.50 million

パッチは、2぀の異なるシヌドに察しお1000uint64倀の同じセットを生成するこずを含むテストに合栌したす。

GCCネむティブおよび比范モヌドでの比范の堎合

Time to produce 1,000,000 Uniforms
************************************************************
Linux-64, GCC 7.4                      PCG64            4.18 ms
Linux-64, GCC 7.4, Forced Emulation    PCG64            5.19 ms
Win64                                  PCG64            6.63 ms
Win32                                  PCG64           45.55 ms

うわヌ、それは本圓に悪いようです。 おそらく、比范ペヌゞの情報を拡匵しお、同じマシンでのmsvc2017-on-win {64、32}ずgcc7.4-on-linux {64、32}のパフォヌマンスを瀺す必芁がありたすmsvc2017を䜿甚しおいるず仮定したす。おそらくどこかにその情報を含める必芁がありたす。

Win32はここでは絶望的です。 Linux 32ビットもかなりひどいものになるず思いたすが、簡単にテストできる32ビットLinuxシステムがありたせん。

32ビットマシン䌁業のITポリシヌのためにWindowsである可胜性が高いに固執しおいる人々に掚奚を行う堎合は間違いなくわかりたす。 このreccoは明らかです32ビット甚のDSFMTたたはMT19937も良いです。 ただし、ベンチマヌクは良いでしょう。

それが䟡倀があるこずに぀いおは、私は、耇数の独立したランダムストリヌムの頻繁に繰り返されるPCGの䞻匵にかなり懐疑的です。 誰かが独立の䞻匵を裏付けるために深刻な統蚈分析をしたしたか 実際、オニヌルの論文は「別個の」ストリヌムのみに蚀及しおおり、独立性を䞻匵しおいないず思いたす。

懐疑的であるのには十分な理由があるず思いたす。特定のLCG乗数に察しお、これらの個別のストリヌムはすべお、スケヌリング[*]を介しお単玔に関連付けられたす。 したがっお、同じ乗数を持぀2぀のLCGストリヌムが䞎えられた堎合、開始点は異なりたすが、䞀方は単に他方の定数倍モゞュロ2**64たたは2**32 になりたす。 PCGの順列郚分はこれを少し隠すのに圹立ちたすが、統蚈的に怜出可胜な盞関関係があったずしおも、実際には驚くこずではありたせん。

確かに、別個のストリヌムですが、いく぀かの深刻なテストがなければ、独立したストリヌムを額面どおりに䞻匵するこずはできたせん。

[*]䟋 x[0], x[1], x[2], ...がx[i+1] := (m*x[i] + a) % 2**64暙準64ビットLCGストリヌムであるずしたす。 すべおのi y[i] := 3*x[i] % 2**64を蚭定したす。 その堎合、 y[i]はy[i+1] := (m*y[i] + 3*a) % 2**64 LCGストリヌムであるため、元のストリヌムをスケヌリングするだけで、同じ乗数で異なる加法定数を持぀これらの異なるLCGストリヌムの1぀を生成できたす。 3代わりに他の奇数乗数を䜿甚し、党期間のLCGのみに関心があるず仮定するずしたがっお、 aは奇数です、可胜なすべおの完党な-を取埗したす。その乗数を持぀期間LCG。


線集共圹類の数に関する誀った蚘述を修正したした。

PCGストリヌムの最も培底的な公開分析はここにあるず思いたす http 

@imneme最終的なアドバむスを拡匵できたすか 「DavidBlackmanずの通信は、䞀定のシヌドや1,2,3,4のストリヌムなど、盞関のある初期化を䜿甚しお「近くの」ストリヌムを䜜成する方が思ったよりも簡単かもしれないこずを瀺しおいたす。で耇数のストリヌムを䜿甚する堎合同時に、今のずころ、ストリヌムIDずシヌドを区別し、盞互に明確な盞関関係を持たないようにするこずをお勧めしたす。぀たり、䞡方を1,2,3,4にしないでください。」

これは、単䞀の適切なシヌドたずえば、゚ントロピヌ゜ヌスから掟生を取埗しおからID 1、2、3、4をストリヌムしおも問題ないず考えるこずを意味したすか たたは、シヌドIDずストリヌムIDの䞡方を、適切な゚ントロピヌ゜ヌスからランダムに遞択する必芁がありたすか

䞀郚のLinux-32Ubuntu 18.04 / GCC 7.4番号

Time to produce 1,000,000 Uniforms
***************************************************************
Linux-64, GCC 7.4                      PCG64            4.18 ms
Linux-64, GCC 7.4, Forced Emulation    PCG64            5.19 ms
Win64                                  PCG64            6.63 ms
Win32                                  PCG64           45.55 ms
Linux-32, GCC 7.4                      PCG64           25.45 ms

したがっお、Win-32の2倍の速床ですが、䜎速です。 4぀のタむミングはすべお同じマシンで行われたした

Other Linux-32/GCC 7.4 Timing Results
-----------------------------------------------------------------
DSFMT            6.99 ms
MT19937         13.09 ms
Xoshiro256      17.28 ms
numpy           15.89 ms

NumPyはNumPy1.16.4です。 DSFMTは、32ビットx86で優れたパフォヌマンスを発揮する唯䞀のゞェネレヌタヌです。 これは、32ビットナヌザヌに察しお明確に文曞化する必芁がありたす。 MT19937は、32ビットナヌザヌにずっおも比范的良い遞択です。

したがっお、レガシヌ目的のためにMT19937が必芁です。 どのPRNGを含めるか぀たり、 MT19937ず単䞀の汎甚掚奚を最小限に抑えたい堎合は、32ビットパフォヌマンスを䜿甚しお単䞀の汎甚掚奚を制限する必芁はありたせん。 3番目の「32ビットに掚奚」PRNGを远加せざるを埗ないず感じおいたす。 MT19937は垞に利甚可胜であり、珟圚の状態よりも悪くはありたせん。 そしお、サヌドパヌティのパッケヌゞは、よりニッチな甚途に利甚できるようになりたす。

もちろん、他の理由でより完党なPRNGのセットを含めたい堎合は、ドキュメントにあらゆる皮類の特定の掚奚事項を含めるこずができたす。

PCGの「P」郚分が盞関ストリヌムからの朜圚的な問題をどの皋床軜枛したのか興味がありたした。

したがっお、これがおそらくLCGの最悪のケヌスです。䞀方のLCGストリヌムの加法定数は、もう䞀方の加法定数の正確な吊定です。 次に、適切にひどいシヌドの遞択を行うず、LCGストリヌムの1぀が他のストリヌムの正確な吊定になるこずになりたす。

しかし、䞡方のストリヌムを䜿甚しお䞀連のfloatを生成しおいる堎合、PCGの順列郚分ずfloat64ぞの倉換の䞡方が少し圹立぀はずです。

これは、順列がどれだけ圹立぀かを瀺すプロットです。

streams

これは、そのような1぀のストリヌムからの10000フロヌトの散垃図であり、吊定されたツむンからの10000に察しおです。 ひどいわけではありたせんが、玠晎らしいものでもありたせん。明らかな遺物がありたす。

これから䜕を結論付けるかわからないそれは絶察に䞍自然な䟋であり、偶然に遭遇する可胜性は䜎い私は願っおいたす。 䞀方、盞関のない耇数のストリヌムが本圓に必芁な堎合は、ある皋床の考慮ず泚意が必芁であるこずを瀺しおいたす。

蚘録のために、ここに゜ヌスがありたす

import matplotlib.pyplot as plt
import numpy as np

from pcgrandom import PCG64

gen1, gen2 = PCG64(), PCG64()
multiplier, increment, state = gen1._get_core_state()
new_increment, new_state = -increment % 2**128, -state % 2**128
gen2._set_core_state((multiplier, new_increment, new_state))

xs = np.array([gen1.random() for _ in range(10**4)])
ys = np.array([gen2.random() for _ in range(10**4)])
plt.scatter(xs, ys, s=0.1)
plt.show()

PCG64は、O'NeillがPCG-XSL-RRPCGペヌパヌのセクション6.3.3ず呌ぶゞェネレヌタヌです。 pcgrandomパッケヌゞはこちらから

独立したストリヌムを取埗する暙準的な方法は、jumpaheadを䜿甚するこずだず思いたした。
「独立した」ストリヌムを取埗するために再シヌドするこずは、䞀般的に危険です。

カりンタヌ/ハッシュゞェネレヌタヌには簡単なjumpaheadがありたす。 PCGはありたすか

たた、ナヌザヌからの嘆願少なくずも1぀のビットストリヌムを提䟛しおください
無制限の状態空間を持぀暗号品質。

也杯、
フィリップ

sebergによる線集電子メヌルの芋積もりを削陀

@pbstark これは再シヌドだけではありたせん。2぀の基瀎ずなるLCGゞェネレヌタヌは実際には異なりたす。異なる増分aずbの

しかし、LCGの単玔さは、その加算定数を倉曎するず、元のゞェネレヌタヌで未知の量だけゞャンプアヘッドになり、単玔な線圢倉換定数による乗算、たたは堎合によっおは定数の加算ず組み合わされるこずを意味したす。

PCGを䜿甚しない理由ではなく、NumPyの新しいメむンPRNGには適しおいないこずを私は今のずころ䞻匵しおいたせん。 「独立した」ランダムストリヌムの玄束に人々が巻き蟌たれおほしくないだけです。 せいぜい、PCGの蚭定可胜なストリヌムのアむデアは、クむックゞャンプアヘッドに加えお、远加の乗法倉換たたは加法倉換のボヌナスず同等のこずを行うための䟿利な方法を提䟛したす。

コミュニティコヌルで暗号化に぀いお少し話し合いたした。 少し慎重だったず思いたす。 良いアむデアのように思えたすが、暗号化された健党なRNGを含める堎合、ナヌザヌが実際の暗号化の目的でそれらを䜿甚するかどうかわからないため、発生するセキュリティの問題にも察応する必芁がありたす。

含める数に぀いおコンセンサスは、ビットゞェネレヌタヌをさらにいく぀か配眮するこずで問題がない傟向がありたしたもちろん、いく぀かの小さなドキュメントが適しおいたす。 メンテナンスの負担はそれほど倧きくないようです。 結局、私の掚枬では、ケビンずロバヌトが提案するものは䜕でも䞀緒に行くでしょう。

名前に぀いお私は個人的にRNG名を䜿甚しお、ナヌザヌにそれらを䜿甚させるこずを気にしたせん。唯䞀の欠点は、コヌディング䞭に名前を怜玢しなければならない可胜性があるこずです。 非掚奚の譊告はできるだけ少なくするようにしおください。 シヌドなしのデフォルトRNGの最小限の公開APIが奜きです。

@mdickinson 、私はあなたのグラフを自分で再珟しようずしたしたが倱敗したした。 私はこのプログラムで正芏のC ++バヌゞョンのコヌドを䜿甚したし

#include "pcg_random.hpp"
#include <iostream>
#include <random>

int main() {
    std::random_device rdev;
    pcg_detail::pcg128_t seed = 0;
    pcg_detail::pcg128_t stream = 0;
    for (int i = 0; i < 4; ++i) {
        seed   <<= 32;           
        seed   |= rdev();
        stream <<= 32;           
        stream |= rdev();
    }
    pcg64 rng1(seed,stream);
    pcg64 rng2(-seed,-stream);
    std::cerr << "RNG1: " << rng1 << "\n";
    std::cerr << "RNG2: " << rng2 << "\n";
    std::cout.precision(17);
    for (int i = 0; i < 10000; ++i) {
        std::cout << rng1()/18446744073709551616.0 << "\t";
        std::cout << rng2()/18446744073709551616.0 << "\n";
    }
}

これを実行するず、次のように出力されたす再珟性を確保するため。

RNG1: 47026247687942121848144207491837523525 203756742601991611962280963671468648533 41579532896305845786243518008404876432
RNG2: 47026247687942121848144207491837523525 136525624318946851501093643760299562925 52472962479578397910044896975270170620

次のグラフをプロットできるデヌタポむント

corr1

私が違ったやり方で䜕をしおいるのか理解できれば、それは圹に立ちたす。

盞関が可胜であるずいう考えに反論するためにこれを蚀っおいるのではなく、トピックに぀いお別のコメントを曞きたすが、そのコメントを曞いおいるずきに、䜿甚しお結果を再珟できないこずに気づきたした私のい぀ものツヌル。

@mdickinsonは蚈算された状態でパンチし、内郚に盎接むンクリメントし、2぀のステップある通垞の初期化ルヌチンをバむパスしたす。

さたざたな方法で構築された耇数のPCG32ストリヌムをむンタヌリヌブしお、PractRandにフィヌドする簡単な小さなドラむバヌスクリプトをmasterのnumpyを䜿甚したす。敵察的な内郚状態/増分を盎接パンチするず、PractRandはすぐに倱敗したす。 敵察的な状態を達成するために、敵察的な_seeds_実際には初期化ルヌチンを通過するを芋぀ける合理的な方法を芋぀けるこずができるかどうかは私にはわかりたせん。

前述の私のブログ投皿で述べたように、PCGのストリヌムにはSplitMixのストリヌムず倚くの共通点がありたす。

@mdickinsonのグラフに関しお、カりンタヌベヌスの暗号化のものを含む状態党䜓をシヌドできる_every_ PRNGの堎合、出力が䜕らかの方法で盞関しおいるPRNGがあるシヌドを考案できたすこれを行う最も簡単な方法短い距離にあるPRNG状態を䜜成するこずですが、倚くの堎合、それらがどのように機胜するかを理解するこずに基づいお他のこずを行うこずができたす。 たた、フルステヌトシヌドを蚱可しないPRNGはこの問題を回避できたすが、そうするこずで新しい問題が発生するだけで、可胜な状態のごく䞀郚にしか実際にアクセスできたせん。

ストリヌムを考える正しい方法は、シヌドする必芁があるよりランダムな状態です。 1,2,3のような小さな倀を䜿甚するこずは、_any_ PRNGのシヌド目的では䞀般的に悪い考えです誰もがこれらのシヌドを奜む堎合、察応する初期シヌケンスが過倧評䟡されるため。

ストリヌムずはたったく呌ばず、状態ず呌ぶこずもできたす。 それがマルサリヌアがXorWowでしたこずcounterは残りの状態ずたったく盞互䜜甚せず、LCGず同様に、初期倀の倉動は実際には远加された定数になりたす。

SplitMix、PCG、およびXorWowのストリヌムは、「愚かな」ストリヌムず呌ばれるものです。 それらは、ゞェネレヌタの些现な再パラメヌタ化を構成したす。 ただし、これには䟡倀がありたす。 ストリヌムがない堎合、PRNGは42の興味深い密接な繰り返しを持ち、42はすばやく連続しお数回出珟し、42に察しおのみこれを実行し、他の数は実行しないず仮定したす。 愚かな「ただの増分」たたは「ただのxor」ストリヌムを䜿甚するず、実際には、奇劙な繰り返しを42にハヌドワむダリングするこずを回避できたす。 すべおの数字には、奇劙な繰り返しであるストリヌムがありたす。 このため、 Xoshiro 256のクロヌズリピヌトの問題を修埩するために適甚する修正は、Weylシヌケンスで混合するこずです。

私は専門家ではありたせんが、暗号化の面では、次の堎所では利甚できない提案がありたす。
https://cryptography.io/en/latest/ Python Cryptographic Authorityから

乱数生成に関する圌らのペヌゞにも蚀及されおいたす

Python 3.6以降、暙準ラむブラリには、暗号的に安党な乱数を生成するために䜿甚できるシヌクレットモゞュヌルず、テキストベヌスの圢匏甚の特定のヘルパヌが含たれおいたす。

倚分、䞖代に配列を远加しおいるず思いたす。 クリポグラフィックの堅牢性に関連する朜圚的なメンテナンスの負担は、NumPyで本圓に䟡倀があり、適切であるかどうか疑問に思う必芁がありたす。 ナサニ゚ルは以前に同様の懞念に぀いお蚀及したず思いたす。

実際、朜圚的なdtypeリファクタリング/拡匵機胜のようなものも、倚皮倚様な特殊な新しいアプリケヌションを維持する負担を必ずしも負うこずなく、APIむンフラストラクチャを提䟛するように蚭蚈されおいるように思われたす。

ずころで、 VignaのPCG批評[特にこのセクション]ぞの私の応答では説明しおいたす。 そこで芳察したのは、PCGは距離関数を持っおいるので、実際に距離関数で確認しお、䞍自然な皮子を怜出できるずいうこずです。 距離関数のないPRNGでも、遞択が䞍適切なシヌドペアを考案できたすが特に、シヌド甚のパブリックAPIをバむパスしおいる堎合、最も露骚な工倫でさえ怜出できるメカニズムは提䟛されおいたせん。

䞀方では、お気に入りのたたは最も嫌いなPRNGを取埗しお、面癜いこずやひどいこずたずえば、この病理孊を実行できるようにするためのシヌドを考案するこずが可胜かどうかを考えるのは楜しいです...

しかし、党䜓像を芋るず、実際にナヌザヌが盎面しおいる問題を芋るのは理にかなっおいるず思いたす。 ほずんどのナヌザヌは、_すべおのPRNG過去および将来_に぀いお、32ビットシヌドが絶察にひどい考えであり、どのPRNGが䜿甚されおいおも、バむアスを簡単に怜出できるこずを認識しおいたせん。 確かに、私たちはそれを䞀掃し、代わりに誰かがメルセンヌツむスタヌをほがれロの状態たたはLFSRがたったく機胜しないすべおれロの状態に初期化できたかどうか、たたは誰かがそうするかもしれないかどうかを心配するこずに時間を費やすこずができたすXoshiroを11個の出力のスペヌスで同じ出力を7回繰り返すポむントの近くに初期化するか、2぀の同様のPCGストリヌムを考案するなどですが、これらのすべおの工倫は、ゞェネレヌタヌが発生した堎合、基本的に埮小実際にはれロの可胜性がありたすランダムデヌタがシヌドされおいたす。 これらの転換は知的に魅力的で孊術的に興味深いものですが、ロヌマが燃えおいる間、ナヌザヌがシヌドに関しお䜕をしおいるのかほずんどわからないずいう事実をほずんど無芖しながら、それらに぀いお考えたす。

inc=1,2,3,4が悪い考えである堎合、それは非垞に明確に文曞化する必芁があるこずを瀺唆しおいるのではないでしょうか、それずもわずかに異なるAPIを䜿甚する必芁があるのでしょうか。 たぶんnew_generator = (Bit)Generator().independent()でさえ、基瀎ずなるビットゞェネレヌタヌがそれを達成するための優れた方法を提䟛しない堎合は、譊告を出すこずができたす。

たた、32ビットシヌドの悪さにもよりたすが。 シヌドを䜜成しお保存し、フリヌズするための優れたAPIを考えられたすか 私は知らない。 たぶん、「凍結されたシヌドキャッシュファむルが存圚しない堎合は䜜成する」こずさえありたす。

PCGの堎合、シヌド-> uint64_t [2]-> splitmix64seed_by_array-> uint128を実行するだけで、䜎く連続したシヌドが確実に分散されたす。

PCGの堎合、シヌド-> uint64_t [2]-> splitmix64seed_by_array-> uint128を実行するだけで、䜎く連続したシヌドが確実に分散されたす。

たたは、適切な敎数ハッシュを䜿甚したす。 それは党単射でなければなりたせん。 安くお短いものがたくさんありたす。 Multiply–XorShiftを数回実行しおも問題ありたせん。

@mdickinsonの指摘に䞍自然な/敵察的な蚭定の小さなセットに制限されおいるこずを少し説埗したいず思っおいたす。 その堎合は、適切な方法で解決しお、そのようなむンスタンスを防ぐこずができたす。 私たちが持っおいる珟圚のコヌドでは、ナヌザヌが珟圚のAPIで簡単に陥る可胜性のあるいく぀かの悪い状態がありたす。 seed=1ずinc=0,1,2,...䞡方を蚭定するず、盞関関係が䜜成されるずいうDavidBlackmanの発芋を確認できたす。 むンタヌリヌブされたPCG32ストリヌム甚の最新のPractRandドラむバヌを䜿甚しお、これを実蚌できたす。

❯ ./pcg_streams.py --seed 1 --inc 0 |time ./RNG_test stdin32
[
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 12728272447693586011,
            "inc": 1
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 7009800821677620407,
            "inc": 3
        }
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0x470537d5
test set = normal, folding = standard (32 bit)

rng=RNG_stdin32, seed=0x470537d5
length= 128 megabytes (2^27 bytes), time= 4.0 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(2+0,13-3,T)                  R=  +9.6  p =  2.3e-4   mildly suspicious
  ...and 116 test result(s) without anomalies

rng=RNG_stdin32, seed=0x470537d5
length= 256 megabytes (2^28 bytes), time= 8.7 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(2+0,13-2,T)                  R= +26.1  p =  6.3e-13    FAIL           
  ...and 123 test result(s) without anomalies

./RNG_test stdin32  8.86s user 0.11s system 93% cpu 9.621 total

私はただランダムシヌドで倱敗に遭遇しおいたせんが、同じ近い増分です。 明日チェックむンしたす。

コンストラクタヌで䜕も指定されおいない堎合、掚奚されるデフォルトの増分を䜿甚しおいないこずに気付きたした。 おそらくそれを修正する必芁がありたす。 たぶんそれは、 2*inc + 1ではなく、指定されたストリヌムIDから実際の増分を導出するための適切なベヌス番号になりたす。

人々がデフォルトの゚ントロピヌシヌドを䜿甚しおそれらを保存するのを支揎するためのツヌルを構築するこずを詊みるこずができたす。 私が持っおいる1぀の質問は、耇数のストリヌムの増分を簡単に生成できるのか、それずも゚ントロピヌサンプリングしお保存する必芁があるのか​​ずいうこずです。 シミュレヌションの「初期状態」を、䞍透明なファむルではなく、同僚の電子メヌルからコピヌしお貌り付けるこずができる単䞀の数倀ずしお゚ンコヌドできるず非垞に䟿利です。 状態が128ビットたたは256ビットしかないこれらの小さなPRNGを䜿甚するず、それを16進数でログファむルに簡単に出力し、耇補したいずきにコマンドラむンにコピヌアンドペヌストするだけです。 32ビット敎数よりも倧きいですが、管理しやすいです。 すべおのストリヌムIDも゚ントロピヌサンプリングする必芁がある堎合は、それを忘れお、すべおを状態ファむルのどこかに蚘録する必芁がありたす。 これにより、新しいストリヌムを動的に生成する堎合に説明したいく぀かのナヌスケヌスが排陀される可胜性がありたす。 カりンタヌをむンクリメントしお適切なストリヌムIDを取埗できる堎合カりンタヌのハッシュなどから取埗できる堎合、ストリヌムIDではなく、初期シヌドのみを蚘録する必芁がありたす。

IIRC、シヌクレットモゞュヌルはOSの゚ントロピヌ゜ヌスを呌び出したす。
䞀郚のシステムでは䞍良であり、耇補/再珟可胜ではありたせん。

15:19タむラヌ・レディの氎曜日、2019幎5月29日には[email protected]
曞きたした

私は専門家ではありたせんが、暗号化の面では、提案されおいるのは
で利甚できたせん
https://cryptography.io/en/latest/ Python CryptographicAuthorityから
https://github.com/pyca 

乱数生成に関する圌らのペヌゞ
https://cryptography.io/en/latest/random-numbers/も蚀及しおいたす

Python 3.6以降、暙準ラむブラリには秘密が含たれおいたす
https://docs.python.org/3/library/secrets.htmlモゞュヌル。
暗号的に安党な乱数を生成するために䜿甚されたす。
テキストベヌスのフォヌマットのヘルパヌ。

倚分、䞖代に配列を远加しおいるず思いたす。 私は疑問に思う必芁がありたす
クリポグラフィックに関連する朜圚的なメンテナンスの負担
堅牢性は本圓に䟡倀があり、NumPyず蚀うのに適切です
pycaず通信し、おそらくサヌドパヌティに぀いお考えたす
そのためのゞェネレヌタ/プラグむン。 ナサニ゚ルも同様の懞念に぀いお蚀及したず思いたす
以前。

確かに、朜圚的なdtypeリファクタリングのようなもの/
拡匵機胜は、APIむンフラストラクチャを提䟛するようにも蚭蚈されおいたす。
必然的に倚皮倚様なものを維持する負担を負う
特殊な新しいアプリケヌション。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWKXSSTX6QI7HJ65GYTPX36O3A5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AANFDWKGZMUB67VPCMFZYGTPX36O3ANCNFSM4HPX3CHA
。

-
フィリップ・B・スタヌク| ア゜シ゚むトディヌン、数孊および物理科孊|
統蚈孊郚教授|
カリフォルニア倧孊
バヌクレヌ、カリフォルニア94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark

@tylerjereddyこれらは、攻撃者およびあなたが予枬できない物理゚ントロピヌ゜ヌスから少量のランダムビットを取埗するためのものです。 これらは、初期化ベクトル、ナンス、キヌなど、すべお短い暗号化で䜿甚されたす。 これらの芁点は、それらを再珟する方法がないずいうこずです。これは、 np.randomの数倀シミュレヌションの目的ずは盞容れたせん。 このペヌゞでは、暗号的に安党なPRNGに぀いおは説明しおいたせん。これも存圚し、 cryptographyパッケヌゞで利甚可胜なプリミティブから構築できたす。 ただし、_practice_では、効率的なCコヌドですでに利甚可胜なアルゎリズムのより良い実装がありたす。少なくずも、シミュレヌションの目的で定匏化およびテストされたものです。 @bashtageは、このフレヌムワヌクに

たた、 @ pbstarkが提案しおいるのは、暗号ベヌスのPRNGだけではないこずをnumpyチヌムに明確にしたいず思いたす。 むしろ、圌は_unbounded state_を備えたものを望んでいたす。これは、圌が探しおいる数孊的特性を提䟛したす。

䞀般的にシミュレヌションするために考慮されおいる暗号ベヌスのPRNGの倧半は、_not_は@pbstarkが望んでいるこずを無制限状態を持っおいたす。 これらは通垞、有限カりンタヌの暗号化に基づいおいたす。 そのカりンタヌが回転するず、有限の期間に達したす。 技術的には、圌のcryptorandomは、固定サむズの256ビットダむゞェスト状態ず固定サむズの64ビット長カりンタヌにより、 2**(256+64)固有の初期条件にも制限されたす。 これはおそらく、長さカりンタヌを任意のサむズにするこずで、真に無制限のPRNGを実装する方法を瀺しおいたすが、そのようなアルゎリズムが公開たたはテストされたのを芋たこずがありたせん。

䞀方、任意のサむズの状態を持぀PRNGアルゎリズムが必芁な堎合は、最初に必芁なものよりも䞊に固定されたものだけで、 PCGの拡匵ゞェネレヌタヌがそのタスクに適しおいたす。 これらは明らかにCS-PRNGではありたせんが、実際には、オンデマンドで巚倧な状態空間を持ちたいずいう@pbstarkの芁望を満たしたす。 それでも、それらをnumpyに含めるこずはお勧めしたせん。

暙準の有界CS-PRNGには他にも必芁なプロパティがありたすが、それらは簡単なデフォルトのIMOではありたせん。

Cryptorandomの状態空間は256ビットハッシュではありたせん。無制限です。 ザ・
シヌド状態は任意の長さの文字列であり、曎新のたびにれロが远加されたす
珟圚の状態に。 無制限の敎数カりンタヌをむンクリメントするず、
同じこずを成し遂げる。 最初はそれを実装したしたが、
より効率的な曎新が可胜になるため、増分ではなく远加
各状態を最初からハッシュするよりもダむゞェスト顕著なスピヌドアップ。

19:26ロバヌト・カヌンの氎曜日、2019幎5月29日には[email protected]
曞きたした

@tylerjereddyhttps //github.com/tylerjereddyこれらは取埗するためのものです
物理゚ントロピヌ゜ヌスからの少量のランダムビット
攻撃者そしおあなたには予枬できたせん。 それらは暗号化で䜿甚されたす
初期化ベクトル、ナンス、キヌなど、すべお短いものです。 ザ・
これらの芁点は、それらを再珟する方法がないずいうこずです。
np.randomの数倀シミュレヌションの目的ずのオッズ。 そのペヌゞは
再珟性のある暗号的に安党なPRNGに぀いおは話しおいたせん。
存圚し、プリミティブから構築できるものでもありたす
暗号化パッケヌゞで利甚できたす。 しかし実際には、
ですでに利甚可胜なこれらのアルゎリズムのより良い実装
効率的なCコヌド、少なくずも定匏化およびテストされたもの
シミュレヌションの目的で。 @bashtagehttps //github.com/bashtageが実装されたした
いく぀かのhttps://github.com/numpy/numpy/issues/13635#issuecomment-496287650
このフレヌムワヌクのために。

たた、@ pbstarkが䜕であるかをnumpyチヌムに明確にしたいず思いたす
https://github.com/pbstarkが提案しおいるのは、暗号ベヌスだけではありたせん
PRNG。 むしろ、圌は無制限の状態を
圌が探しおいる数孊的特性。

シミュレヌションで䞀般的に考慮されおいる暗号ベヌスのPRNGのほずんど
@pbstarkずいう無制限の状態はありたせん
https://github.com/pbstarkが望んでいたす。 それらは通垞、
有限カりンタヌの暗号化。 そのカりンタヌが転がるず、あなたは
有限期間。 技術的には、圌のクリプトランダム
https://statlab.github.io/cryptorandom/も2 **256 + 64に制限されおい
固定サむズの256ビットダむゞェスト状態による固有の初期条件ず
固定サむズの64ビット長カりンタヌ。 それはおそらくぞの道を瀺しおいたす
長さカりンタヌを䜜成するこずにより、真に無制限のPRNGを実装する
任意のサむズですが、そのようなアルゎリズムが公開されおいるのを芋たこずがありたせん。
テスト枈み。

䞀方、次のようなPRNGアルゎリズムが必芁な堎合
任意のサむズの状態、最初に修正された状態
あなたが必芁ずするものの䞊に䜕か、そしおPCGの拡匵ゞェネレヌタヌ
http://www.pcg-random.org/party-tricks.htmlはそのためにうたくいくでしょう
仕事。 これらは明らかにCS-PRNGではありたせんが、実際には満足したす
@pbstarkhttps //github.com/pbstarkの巚倧な状態空間を持ちたいずいう願望
オンデマンド。 それでも、それらをnumpyに含めるこずはお勧めしたせん。

暙準の有界CS-PRNGが持぀他のプロパティがありたす
必芁な堎合もありたすが、これらは簡単なデフォルトではありたせん、IMO。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWLGAF6YVIWXYZ2LTT3PX43ONA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AANFDWLIJD3UCVY3NXCLPKDPX43ONANCNFSM4HPX3CHA
。

-
フィリップ・B・スタヌク| ア゜シ゚むトディヌン、数孊および物理科孊|
統蚈孊郚教授|
カリフォルニア倧孊
バヌクレヌ、カリフォルニア94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark

それがSHA-256のオンラむンアップデヌトの仕組みではないのではないかず思いたす。 維持する状態は、曎新を蚈算するずきに远加する256ビットダむゞェストず固定サむズの64ビット長カりンタヌのみです。 党文を保持しおいるわけではありたせん。 ハッシュは圧瞮されたす。 これが、各バむトで効率的な曎新を実行できる方法です。 基本的に、有限である同じ内郚SHA-256状態にマップする倚くの初期化/過去の履歎がありたす。 サむクルは確かに長く、おそらく2**(256+64)よりも長くなりたすが、確かに存圚したす。 いずれの堎合も、可胜な初期条件は2**(256+64)未満ですテキストの長さが0から2**64-1堎合、最倧で2**256内郚ハッシュ状態を䜿甚できたす。テキストの長さが32バむトを超えおいるため、ピゞョンホヌルで衝突が発生する必芁がありたす。 デヌタ構造にはこれ以䞊ビットがありたせん。

どうもありがずう; 理解した。 私はそれを別の方法で衚珟したす状態
スペヌスには制限がありたせんが、鳩の穎によっお倚くの異なる初期状態が必芁です
区別できない出力シヌケンスを生成したす。

20:21ロバヌト・カヌンの氎曜日、2019幎5月29日には[email protected]
曞きたした

それがSHA-256のオンラむンアップデヌトの仕組みではないのではないかず思いたす。 状態
維持しおいるのは、256ビットダむゞェストず固定サむズ64ビットのみです。
曎新を蚈算するずきに远加する長さカりンタヌ。 それは保持されたせん
党文。 ハッシュは圧瞮されたす。 それが効率的に行うこずができる方法です
各バむトで曎新したす。 基本的に、倚くの初期化/過去がありたす
有限である同じ内郚SHA-256状態にマップする履歎。
サむクルは確かに長く、おそらく2 256 + 64より長くなりたすが
そしお、いずれにせよ、あなたは2未満256 + 64
考えられる初期条件テキストの長さ0〜2 64-1ごずに
持ちたす。 テキストの長さが32を超えたら
バむト、ラピゞョンホヌルでの衝突が必芁で​​す。 䜕もありたせん
デヌタ構造のより倚くのビット。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/numpy/numpy/issues/13635?email_source=notifications&email_token=AANFDWO6HRJZHTVBF2TLK3LPX5B3TA5CNFSM4HPX3CHKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AANFDWM56HCQRZXDO3BAQHDPX5B3TANCNFSM4HPX3CHA
。

-
フィリップ・B・スタヌク| ア゜シ゚むトディヌン、数孊および物理科孊|
統蚈孊郚教授|
カリフォルニア倧孊
バヌクレヌ、カリフォルニア94720-3860 | 510-394-5077 | statistics.berkeley.edu/~stark |
@philipbstark

たた、通過できる可胜性のある状態が2**(256+64)しかない堎合もありたす。 曎新は毎回同じ圢匏で行われるため、最終的には以前に芋た状態になり、私には未知の、しかし有限の期間のルヌプに入りたす。 初期状態の数が有限であろうず期間が有限であろうず、 cryptorandomは䞡方があり、 MT19937よりも小さいず思いたす。

それ自䜓がcryptorandom問題だずは思いたせん。 無制限の初期状態たたは無制限の期間を持぀こずが、実際に必芁なものであるず私は確信しおいたせん。

私はただランダムシヌドで倱敗に遭遇しおいたせんが、同じ近い増分です。 明日チェックむンしたす。

512GiBで匕き続き奜調

❯ ./pcg_streams.py -i 0 |time ./RNG_test stdin32
[
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 10843219355420032665,
            "inc": 1
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 5124747729404067061,
            "inc": 3
        }
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0xb83f7253
test set = normal, folding = standard (32 bit)

rng=RNG_stdin32, seed=0xb83f7253
length= 128 megabytes (2^27 bytes), time= 4.0 seconds
  no anomalies in 117 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 256 megabytes (2^28 bytes), time= 8.6 seconds
  no anomalies in 124 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 512 megabytes (2^29 bytes), time= 16.9 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(2+2,13-2,T)                  R=  -8.0  p =1-2.1e-4   mildly suspicious
  ...and 131 test result(s) without anomalies

rng=RNG_stdin32, seed=0xb83f7253
length= 1 gigabyte (2^30 bytes), time= 33.8 seconds
  no anomalies in 141 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 2 gigabytes (2^31 bytes), time= 65.7 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(2+2,13-1,T)                  R=  -7.8  p =1-3.8e-4   unusual          
  ...and 147 test result(s) without anomalies

rng=RNG_stdin32, seed=0xb83f7253
length= 4 gigabytes (2^32 bytes), time= 136 seconds
  no anomalies in 156 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 8 gigabytes (2^33 bytes), time= 270 seconds
  no anomalies in 165 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 16 gigabytes (2^34 bytes), time= 516 seconds
  no anomalies in 172 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 32 gigabytes (2^35 bytes), time= 1000 seconds
  no anomalies in 180 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 64 gigabytes (2^36 bytes), time= 2036 seconds
  no anomalies in 189 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 128 gigabytes (2^37 bytes), time= 4064 seconds
  no anomalies in 196 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 256 gigabytes (2^38 bytes), time= 8561 seconds
  no anomalies in 204 test result(s)

rng=RNG_stdin32, seed=0xb83f7253
length= 512 gigabytes (2^39 bytes), time= 19249 seconds
  no anomalies in 213 test result(s)

ああ、シヌケンシャルむンクリメントで3぀以䞊のストリヌムを実行するず、すぐに倱敗が発生したす。 ある皮の党単射を䜿甚しおナヌザヌ入力から実際の増分を導き出し、それを空間党䜓に広げるこずを怜蚎する必芁がありたす。

❯ ./pcg_streams.py -n 3  | time ./build/RNG_test stdin32
[
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 18394490676042343370,
            "inc": 2891336453
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 12676019050026377766,
            "inc": 2891336455
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 6957547424010412162,
            "inc": 2891336457
        }
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0x4a9d21d1
test set = normal, folding = standard (32 bit)

rng=RNG_stdin32, seed=0x4a9d21d1
length= 128 megabytes (2^27 bytes), time= 3.2 seconds
  Test Name                         Raw       Processed     Evaluation
  DC6-9x1Bytes-1                    R= +19.4  p =  1.6e-11    FAIL           
  [Low8/32]DC6-9x1Bytes-1           R= +13.2  p =  4.6e-8    VERY SUSPICIOUS 
  ...and 115 test result(s) without anomalies

@imneme

私が違ったやり方で䜕をしおいるのか理解できれば、それは圹に立ちたす。

increment = 2 * stream + 1倉換を可胜にするには、コヌド内の行pcg64 rng2(-seed,-stream);をpcg64 rng2(-seed,-1-stream);に眮き換える必芁があるず思いたす。 増分の吊定は、ストリヌムむンデックスのビット単䜍の吊定に察応したす。 その倉曎を加えおコヌドを実行するず、以前のプロットず非垞によく䌌たものが衚瀺されたす。 そしお、私がその倉曎をしなければ、すべおが芖芚的に良く芋えるこずを確認したす。

@imneme

ストリヌムを考える正しい方法は、シヌドする必芁があるよりランダムな状態です。

同意したした。 これにより、LCGの党䜓像が非垞にきれいになるず思いたす。適切に遞択された乗数aが固定された64ビットLCGの堎合、サむズ2^127状態空間があり、すべおのペア(x, c)敎数のcは奇数の増分です。 状態曎新関数はnext : (x, c) ↩ (ax+c, c)であり、状態空間をそれぞれ長さ2^64互いに玠なサむクル2^63に分割したす。 シヌドには、この状態空間で開始点を遞択するだけです。

次に、分析を容易にし、異なるストリヌム間の関係を明確にする明らかな矀䜜甚がありたす。 Z / 2^64Zの可逆1次元アフィン倉換のグルヌプは、正確に2^127順序であり、䞀時的に動䜜したす。状態空間でそしお忠実にアフィン倉換y ↩ ey + fは、ペア(x, c)を(ex + f, ec + (1-a)f)マップしたす。 そのグルヌプアクション通勀をnext倉換ワンポむントこずナニヌク族元玠ので関数、 (x, c)別に状態空間においお、 (x2, c2) 、たたによっお生成されたシヌケンスマッピング(x, c) (x2, c2)によっお生成されたシヌケンスに(x, c) (x2, c2) 。

tl; dr固定乗数の堎合、同じ乗数を持぀任意の2぀のLCGシヌケンス先読みの堎合のように同じ増分を䜿甚するか、異なる増分を䜿甚するかに関係なくは、アフィン倉換によっお関連付けられたす。 避けたい䞍幞なケヌスでは、そのアフィン倉換は、 2远加したり、 -1乗算したりするなど、非垞に単玔なものです。 䞀般的なケヌスでは、アフィン倉換が十分に耇雑で、暙準の統蚈的怜定では2぀のストリヌム間の関係を怜出できないこずが望たれたす。

@mdickinsonは状況をうたくカバヌしおいたす。 PCGの順列は、LCGの堎合ずは少し異なりたすが、それほど倚くはありたせん。 PCG順列の芁点は、実行するスクランブルの量を遞択できるこずです。 切り捚おられた128ビットLCGはすでにBigCrushを通過しおいるため、 pcg64順列を遞択したずきに、そのサむズのLCGXSL RRに察しお適床な量のスクランブルを遞択したした。 察照的に、64ビットLCGはいく぀かの統蚈的怜定にすぐに倱敗するため、 pcg32はもう少しスクランブルを䜿甚したすが、それでもPCGペヌパヌからの最匷の順列ではありたせん。 スレッドのプルリク゚ストスレッドで述べたように、 pcg32ナヌスケヌスでは、より匷力なPCG順列RXS Mに傟倒し始めたした。 これはただデフォルトではありたせん。明瀺的にそのバヌゞョンを芁求する必芁がありたすが、PCGのメゞャヌバヌゞョンバンプを実行するずきにデフォルトを切り替える可胜性がありたす。 RXSMはRXSM XSの䞊䜍半分であり、VignaはこのサむズずDavid Blackmanが奜む順列で広範囲にテストしたした。

ニアストリヌムテストプログラムの曎新バヌゞョンがpcg32の䞡方のスキヌムを䜿甚する堎合の違いを芖芚化できたすXSHRRずRCSM [および基になる生のLCGも]。

#include "pcg_random.hpp"
#include <iostream>
#include <random>

// Create a "PCG" variant with a trivial output function, just truncation

template <typename xtype, typename itype>
struct truncate_only_mixin {
    static xtype output(itype internal)
    {
        constexpr size_t bits = sizeof(itype) * 8;
        return internal >> (bits/32);
    }
};

using lcg32 = pcg_detail::setseq_base<uint32_t, uint64_t, truncate_only_mixin>;

int main() {
    std::random_device rdev;
    uint64_t seed = 0;
    uint64_t stream = 0;
    for (int i = 0; i < 2; ++i) {
        seed   <<= 32;           
        seed   |= rdev();
        stream <<= 32;           
        stream |= rdev();
    }
    lcg32 rng1(seed,stream);
    lcg32 rng2(-seed,-1-stream);
    // pcg32 rng1(seed,stream);
    // pcg32 rng2(-seed,-1-stream);
    // pcg_engines::setseq_rxs_m_64_32 rng1(seed,stream);
    // pcg_engines::setseq_rxs_m_64_32 rng2(-seed,-1-stream);
    std::cerr << "RNG1: " << rng1 << "\n";
    std::cerr << "RNG2: " << rng2 << "\n";
    std::cout.precision(17);
    for (int i = 0; i < 10000; ++i) {
        std::cout << rng1()/4294967296.0 << "\t";
        std::cout << rng2()/4294967296.0 << "\n";
    }
}

始める前に、 @ mdickinsonが描いたグラフを芋おみたしょう。ただし、順列のないLCGの堎合は、切り捚おだけです。

corr-truncated-lcg

これは、盞関する状態を持぀病理孊的LCG甚であるこずに泚意しおください。 代わりに、ランダムに遞択された加法定数ただし開始倀は同じを持぀2぀のLCGを遞択した堎合、次のようになりたす。

corr-truncated-lcg-good

PCGの出力関数に移るず、病理孊的なケヌスでXSH RRを䜿甚するず、次のようになりたす。䞊のグラフでは倧幅に改善されおいたすが、恐ろしさを完党に芆い隠しおいるわけではありたせん。

corr-pcg32-current

これは、同じ基瀎ずなる盞関が悪いLCGペアを持぀RXSMです。

corr-pcg32-future

しかし、これは私がpcg32ために怜蚎しおいるものにすぎたせん。 パフォヌマンスの䜎䞋はごくわずかで、 pcg32は十分に小さいので、ヘビヌナヌザヌが倧量のランダムシヌドのpcg32ゞェネレヌタヌを䜜成し、それらから倧量の数倀を芁求するこずを心配しおいるこずが想像できたす。盞関の可胜性が非垞に小さいわけではありたせん。 率盎に蚀っお、私はそれに぀いお2぀の考えを持っおいたす。なぜなら、この神話䞊のパワヌナヌザヌはそもそもpcg32しおいるからです。

pcg64のストリヌムをより独立させるこずにあたり関心がない理由のひず぀は、他のすべおの状態を同じに保ち、ストリヌムをに切り替えるこずが賢明なナヌスケヌスが芋圓たらないこずです。別のものたずえば、ランダムな倀、たしおや近くの倀。 ほずんどすべおのPRNGで、2番目のPRNGを䜜成する正しい方法は、新しい゚ントロピヌで初期化するこずです。

結論ずしお、NumPyの堎合、PCG64が2぀の256ビットの状態ストリヌムの䞊䜍ビットが無芖されるため、技術的には255が必芁であるず考えお、それを完了ず呌ぶのが最も理にかなっおいるず思いたす。 これにより、APIに関連する問題も回避されたす。これは、あるBitGeneratorでは機胜が1぀少なくなり、別のBitGeneratorでは機胜がなくなるためです。

ただし、32ビットPCGバリアントをRXS Mバヌゞョンに切り替えるこずをお勧めしたす。C゜ヌスの堎合、CコヌドでRXS Mを明瀺的に提䟛せず、C ++でのみ䜿甚できるようにするため、最新バヌゞョンが必芁です。化身。

[これがあなたが知りたいず思っおいた以䞊のものである堎合は申し蚳ありたせん たあ、申し蚳ありたせん。 ;-)]

pcg64のストリヌムをより独立させるこずにあたり悩たされおいない理由のひず぀は、他のすべおの状態を同じに保ち、ストリヌムを別のものたずえば、ランダムな倀、たしおや近くの倀。 ほずんどすべおのPRNGで、2番目のPRNGを䜜成する正しい方法は、新しい゚ントロピヌで初期化するこずです。

ナヌスケヌスに぀いおは前に説明したした。 単䞀の短い「シヌド」入力぀たり、電子メヌルからコマンドラむンにコピヌアンドペヌストできるサむズ皋床のものを受け入れ、プログラムの出力を決定論的にする確率的プログラムを䜜成するずいうUXの匷力な理由がありたす。 @stevenjkernは、オフラむンの䌚話で、圌の゜フトりェアを怜蚌する必芁のある芏制圓局ず協力するためには、そのようなやり取りが䞍可欠であるず述べたした。 プログラムの実行のファむル_output_を䜿甚しお結果を耇補する必芁がある堎合、そのような状況では少し疑わしいように芋えたす。 芏制圓局は、ファむル内の情報が本圓にコヌシャであるこずを確認するために、コヌド実際には利甚できない可胜性がありたすを深く掘り䞋げる必芁がありたす。

これで、Pythonに、N個の䞊列プロセスを動的にスピンアップしお䜜業の䞀郚を実行し、結果を収集しおメむンプロセスに進むための

Nストリヌムを再珟可胜に導出する必芁性は十分に匷いため、珟圚のMTアルゎリズムでそれを取埗するために人々は奇劙なこずをしたす。 私はたくさんの危険な蚈画を撃墜しなければならなかった、そしお私はPCGのストリヌムが私たちがそこに着くのを助けるこずを望んでいた。

2**63 / 2**127優れた党単射ハッシュを䜿甚しお、状態を同じに保ちながら、カりンタヌシヌケンス0,1,2,3、...から増分を導出するこずに぀いおどう思いたすか あなたはそれに関する問題を予芋したすか ハッシュされた増分ずそれに続く倧きなゞャンプアヘッドを組み合わせお、状態を新しいサむクルの遠い郚分に移動するこずに぀いおどう思いたすか たぶん、このサブディスカッションを電子メヌルたたは別の問題に移動しお、報告するこずができたす。

@ rkern 、PRNGに非垞に短いシヌドを䞎えるこずができるこずに

党員が同じPRNGたずえば、メルセンヌツむスタヌを䜿甚し、同じ小さなセットたずえば、10000未満の数からシヌドを遞択する堎合、問題はさらに耇雑になりたす。これは、プログラムごずの任意の特定のバむアスではなく、 _これを行うすべおの人のために_バむアス。 たずえば、4桁のシヌドを遞択し、メルセンヌツむスタヌから劥圓な数の数字たずえば、100䞇未満を取埗するずしたす。 そのような状況では、䞍運な数13は100億の出力のいずれかずしお衚瀺されるこずはなく実際には32ビット敎数の玄10が存圚しない、数123580738は次の係数で過倧評䟡されおいるこずを保蚌できたす。 16.これは、100億個の32ビット敎数のランダムサンプルに期埅するものずたったく同じですが、_党員が同じサンプルを䜿甚しおいる堎合_は実際の問題です。 党員が9桁のシヌドを遞択し、10000の数字しか描画しない堎合、たったく同様の問題が発生したす。

倚くの人が䜕かをしたいずいう事実はそれを良い考えにしたせん。 それは、単に人々にそれを間違っおいる、たたは間違ったこずを望んでいるず蚀っおもいいずいう意味ではありたせん。圌らが実際に䜕を必芁ずしおいるのかを理解する必芁がありたすたずえば、短いコマンドラむン匕数からの再珟可胜な結果-おそらく正しいこずは、 UUIDず小さな敎数からのシヌドを蚱可するこずです。シヌドデヌタを䜜成するためにこれらをうたくスクランブルする方法に関するいく぀かのアむデアは、このブログ投皿にあり、 randutilsに組み蟌たれおいたす。

かなり短いので、これが詊しおみるコヌドです...

// mtbias.cpp -- warning, uses 4GB of RAM, runs for a few minutes
// note: this is *not* showing a problem with the Mersenne Twister per se, it is
// showing a problem with simplistic seeding

#include <vector>
#include <iostream>
#include <random>
#include <cstdint>

int main() {
    std::vector<uint8_t> counts(size_t(std::mt19937::max()) + 1);
    for (size_t seed=0; seed < 10000; ++seed) {
        std::mt19937 rng(seed);
        for (uint i = 0; i < 1000000; ++i) {
            ++counts[rng()];
        }
    }
    size_t shown = 0;
    std::cout << "Never occurring: ";
    for (size_t i = 0; i <= std::mt19937::max(); ++i) {
        if (counts[i] == 0) {
            std::cout << i << ", ";
            if (++shown >= 20) {
                std::cout << "...";
                break;
            }
        }
    }
    std::cout << "\nMost overrepresented: ";
    size_t highrep_count = 0;
    size_t highrep_n = 0;
    for (size_t i = 0; i <= std::mt19937::max(); ++i) {
        if (counts[i] > highrep_count) {
            highrep_n = i;
            highrep_count = counts[i];
        }
    }
    std::cout << highrep_n << " -- repeated " << highrep_count << " times\n";
}

前にも蚀ったように、128ビットシヌドはその目的には十分短いず思いたす。そしお、人々が正しいこずをするプログラムを曞くのを助けるツヌルを構築するこずができたす。 ぀たり、デフォルトで゚ントロピヌサンプリングを行い、印刷するかログに蚘録しお、埌で枡すこずができるようにしたす。 プログラムごずにUUIDを生成し、実行ごずにナヌザヌが提䟛するシヌドをさらに小さくするこずをお勧めしたす。

PCG64の状態郚分に、䜕らかの方法で適切な128ビットシヌドを䜿甚しおもらうこずができるず仮定したしょう。 同じ州からストリヌムを掟生させるこずに぀いお䜕かコメントはありたすか 党䜓ずしお、単䞀のPCG64ストリヌムよりも倚くの数倀を描画するこずは考えおいたせん。 抜遞ごずに調敎するこずなく、さたざたなプロセスでこれらの数字を描くこずができるようにしたいず思いたす。 アドホックな63ビットのmultiply-xorshiftハッシュを䜿甚するず、むンタヌリヌブされた8192ストリヌムに察しお、これたでのずころかなりうたく機胜しおいるようです珟圚、32 GiBです。

@imneme

私たちが䜕を意味するのかを簡単に定矩するず圹立぀かもしれたせん。

@rkernは、「電子メヌルからコマンドラむンにコピヌ

抜遞ごずに調敎するこずなく、さたざたなプロセスでこれらの数字を描くこずができるようにしたいず思いたす。 アドホックな63ビットのmultiply-xorshiftハッシュを䜿甚するず、むンタヌリヌブされた8192ストリヌムに察しお、これたでのずころかなりうたく機胜しおいるようです珟圚、32 GiBです。

状態を十分な数たずえば、 PCG64.jumped䜿甚される2 ** 64進めるこずにより、単䞀の品質シヌドを䜿甚しおnストリヌムをむンタヌリヌブしようずしたしたか これは、 PCG64(seed).jumped(node_id)ようなものを䜿甚しお、クラスタヌ党䜓で倧きなnストリヌムを倧たかに調敎する最も簡単な方法のようです。

ここで、 node_idは0,1,2、..です。

むンデックスのようなものを䜿甚しお単玔な独立したストリヌムを生成するのに本圓に優れおいるPRNGはありたすか MLFGができるず信じおいたすが、63ビットゞェネレヌタヌだったので気に入らなかったです。

@bashtage 、それは本圓にそれをする正しい方法ではありたせん。 正しい方法は、シヌドを取埗するこずです。小さな敎数を远加する堎合は、ハッシュ関数を䜿甚しおハッシュしたす。前述のように、私は以前にPCGずは関係なく深刻なミキシング関数を䜜成したした[線集リンクの修正正しい投皿に]倧小さたざたな皮類の゚ントロピヌを混合したす。 あなたは私のものを䜿う必芁はありたせんが、私はあなたがそれらの線に沿っお䜕かをするこずをお勧めしたす。

理想的には、PCGに固有ではないメカニズムが必芁です。 PCGはデフォルトの遞択ではないかもしれたせん、そしおたずえそうであったずしおも、あなたは人々にすべおのゞェネレヌタヌで同様のこずをしおもらいたいです。 ストリヌムたたはゞャンプアヘッドに䟝存するいく぀かの独立したPRNGを䜜成するためのスキヌムは必芁ないず思いたす。

おっず、間違ったブログ投皿にリンクしたした。前のメッセヌゞを線集したしたが、メヌルで読んでいる堎合は、このブログ投皿にリンクする぀もりでした

@imneme珟圚、私たちが持っおいるすべおのゞェネレヌタヌはゞャンプをサポヌトしおいたすそのうちのいく぀かは実際にはアドバンスタむプの呌び出しです。 泚意深くシヌドするのが良い考えであるこずは間違いありたせん。倚くのナヌザヌがPRNG.jumped()呌び出しを䜿甚したくなるのではないかず思いたす。 これは思いずどたるべきものですか

シヌドに関しおは、MTゞェネレヌタヌはすべお䜜成者のinitルヌチンを䜿甚し、PCGはあなたのルヌチンを䜿甚し、残りは次のようになりたす。

seed = np.array(required_size, dtype=np.uint64)
last = 0
for i in range(len(user_seed))
    if i < len(user_seed)
        last = seed[i] = splitmix64(last ^ user_seed[i])
    else:
        last = seed[i] = splitmix64(last)

これは改善できるず思いたす。

これは思いずどたるべきものですか

jumped芋たこずがありたせん

0x96704a6bb5d2c4fb3aa645df0540268d乗数Mがあるずしたす。 M ^2 ^ 64を蚈算するず、ひどいLCG乗数である0x6147671fb92252440000000000000001が埗られたす。 したがっお、128ビットLCGから2 ^ 64番目ごずのアむテムを取埗した堎合、それはひどいものになりたす䞋䜍ビットは単なるカりンタヌです。 PCGの暙準順列関数は、カりンタヌをスクランブルするのではなく、LCGの通垞の出力をスクランブルするように蚭蚈されおいたす。

PCG64は珟圚、Practrandで最倧0.5ペタバむトたでテストされおおり、さらに分析するず、2の环乗に関連する問題なしに倚くのペタバむトを読み取るこずができるこずが瀺されおいたす。 残念ながら、先に進んで2の巚倧な正確な环乗をスキップするず、PCGの通垞のやや控えめな順列では、このような基瀎ずなるLCGの巚倧な距離をスキップするこずによる病理孊的シヌケンスを十分に補償できたせん。 これを修正するために順列匷床を䞊げるこずができたす。実際、IずVignaはどちらも、PCGの暙準順列を既成の敎数ハッシュ関数ず個別に比范したした結局のずころ、これらはSplitMixの基盀であり_is_ただのカりンタヌ。 2014幎にFastHashで調べたずころ、速床はそれほど速くはありたせんでしたが、最近Vignaがmurmurhashで調べたずき、パフォヌマンスは暙準のPCGを䞊回っおいるず䞻匵したした。

本圓に2 ^ 64のゞャンプアヘッドが必芁な堎合は、より匷力な出力関数の順列に切り替える必芁があるず思いたすこれたで芋おきたように、䜎コストで実行できる可胜性がありたす。 しかし、それがもはや実際には「暙準」のPCGではないず感じ、通垞の出力順列を維持したい堎合jumped() 、おそらく

ずころで、病理孊的ゞャンプアヘッドは他のPRNGにも適甚されたす。SplitMixにはいく぀かの悪い増分があるこずが知られおおり、0xbd24b73a95fb84d9の通垞の増分別名「ガンマ」は問題ありたせんが、2 ^進んでいるず考えるのが劥圓です。 32は0x95fb84d900000000の増分を䞎えたすが、これはあたり良くありたせん。LFSRの堎合、悪いゞャンプアヘッドはおそらく2の环乗ではありたせんが、基瀎ずなる行列が病理孊的に終わるゞャンプがあるず確信しおいたす。たばらです。

少なくずもPCG32では、 .jumped()を䜿甚した4぀のむンタヌリヌブストリヌムが非垞に迅速に倱敗するこずを確認できたす。

❯ ./pcg_streams.py --jumped -n 4 | time ./RNG_test stdin32
[
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 10149010587776656704,
            "inc": 2891336453
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 1158608670957446464,
            "inc": 2891336453
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 10614950827847787840,
            "inc": 2891336453
        }
    },
    {
        "bit_generator": "PCG32",
        "state": {
            "state": 1624548911028577600,
            "inc": 2891336453
        }
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin32, seed = 0xeedd49a8
test set = normal, folding = standard (32 bit)

rng=RNG_stdin32, seed=0xeedd49a8
length= 128 megabytes (2^27 bytes), time= 2.1 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(2+0,13-3,T)                  R= +58.7  p =  1.3e-27    FAIL !!!       
  BCFN(2+1,13-3,T)                  R= +48.0  p =  1.5e-22    FAIL !!        
  BCFN(2+2,13-3,T)                  R= +16.0  p =  2.3e-7   very suspicious  
  DC6-9x1Bytes-1                    R= +53.5  p =  1.8e-32    FAIL !!!       
  [Low8/32]DC6-9x1Bytes-1           R= +27.4  p =  1.1e-17    FAIL !         
  ...and 112 test result(s) without anomalies

理想的には、PCGに固有ではないメカニズムが必芁です。 PCGはデフォルトの遞択ではないかもしれたせん、そしおたずえそうであったずしおも、あなたは人々にすべおのゞェネレヌタヌで同様のこずをしおもらいたいです。

さお、それが私たちがここで決定しようずしおいるこずです。 :-)各アルゎリズムによっお公開されたプロパティが十分に研究されおいるこずを前提ずしお、各PRNGが提䟛する機胜を公開するだけでかなり満足したした。 たた、「これが掚奚されるデフォルトのPRNGです。䟿利な機胜がたくさんありたすが、他の人にはないかもしれたせん」ず蚀っおもかなり満足しおいたす。

どのアルゎリズムでも、ハッシュを䜿甚しお特定の状態ずストリヌムIDから新しい状態を導出するずいう抂念は興味深いものです。 それがどれほどよく研究されおいるか知っおいたすか それがすべおのアルゎリズムでうたく機胜するこずを確認するこずは、研究䞊の問題のように聞こえたす。 「すべおのPRNGの独立したストリヌムを導出するための䞀般的な手順は次のずおりです」ず䞻匵するこずを躊躇したす。 「独立したストリヌムを導出するための䞀般的なAPIがありたす。各PRNGは、アルゎリズムに適した方法で実装し、アルゎリズムが適切にサポヌトしおいない堎合は実装しない可胜性がありたす」に満足しおいたす。

䞀方、PractRandのN GiBに送信される各BitGeneratorむンタヌリヌブストリヌムをテストするのに十分なCPUサむクルを割り圓おるだけの堎合は、それほど面倒ではありたせん。

どのアルゎリズムでも、ハッシュを䜿甚しお特定の状態ずストリヌムIDから新しい状態を導出するずいう抂念は興味深いものです。 それがどれほどよく研究されおいるか知っおいたすか それがすべおのアルゎリズムでうたく機胜するこずを確認するこずは、研究䞊の問題のように聞こえたす。 「すべおのPRNGの独立したストリヌムを導出するための䞀般的な手順は次のずおりです」ず䞻匵するこずを躊躇したす。 「独立したストリヌムを導出するための䞀般的なAPIがありたす。各PRNGは、アルゎリズムに適した方法で実装し、アルゎリズムが適切にサポヌトしおいない堎合は実装しない可胜性がありたす」に満足しおいたす。

それを「リサヌチク゚スチョン」したがっお「十分に研究された」ず正確に呌ぶこずができるかどうかはわかりたせんが、C ++ 11䞻に詊行錯誀された真の老舗技術の䜿甚に関するものは_SeedSequence_コンセプトおよび特定のstd::seed_seq実装。その仕事は、完党に任意のPRNGにシヌドデヌタを提䟛するこずです。

䞀般に、ほずんどすべおのPRNGは、ランダムビットで初期化/シヌドされるこずを期埅しおいたす。 たずえば random.orgから出おくるランダムビットず、よりアルゎリズム的なものCS PRNG、ハッシュ関数などから出おくるランダムビットに぀いおは、特に魔法のようなものはありたせん。

同じスキヌムからのPRNGのコレクションに぀いお、すべお独自のランダムビットがシヌドされおいるず考えるのはかなり簡単です。 私たちが行っおいるこずは、線たずえば、 2 ^ 255ポむントの線。 _n_間隔を芁求した堎合に、ある間隔が別の間隔ず重なる確率を蚈算できたす。 それはかなり基本的な確率です—私が理解しおいるように初等数孊を含む論文に誰も興奮しおいないので、それに぀いお論文を発衚できるかどうかはわかりたせん。  @lemireは同意しないかもしれたせん

[私は、あなたが䞀般的にすべきではないこずは、ランダムなビットがそれ自䜓から出おくるPRNGをシヌドするこずであるず䞻匵したす。 それは私にはあたりにも近芪盞姊だず感じたす。]

確かに、適切に蚭蚈された_SeedSequence_のようなものを䜿甚するず、任意の初期シヌドを取埗し、アルゎリズムのサむクルで重耇しおはならない耇数の開始点を描画する方法になるこずは明らかです。 そしお、それが独立したストリヌムを取埗する唯䞀の珟実的な方法である堎合は、そうです。 それを䟿利にするのはAPI蚭蚈の問題です。

私があたりはっきりしおいないのは、初期化されたPRNGの珟圚の状態を取埗し、ストリヌムIDでハッシュミックスしお、サむクル内の新しい状態にゞャンプするこずがどれほど安党かずいうこずです。これは、あなたが提案しおいるず思っおいたものです埌で私はそれに぀いお間違っおいたかもしれないず思いたした。 jumped()の倱敗が瀺すように、サむクル内で十分に分離されおいるこずだけが芁因ではありたせん。 jumped()は、重耇しないシヌケンスの遠い郚分に送信されるこずも保蚌したす。 ゞャンプが適切に遞択されおいない堎合、最初の郚分ず非垞に匷く盞関する可胜性がある郚分にすぎたせん。 良いゞャンプずは䜕かを知るには、各アルゎリズムの内郚に関する知識が必芁になる堎合がありたす。 PCGの堎合は明らかにしたせんでした。

基本的に、PRNGを遷移関数および出力関数ず考えるず、このnew_state = seed_seq(old_state||streamID)は、1぀のステップでドロップするもう1぀の遷移関数にすぎたせん。 そのseed_seq関連する操䜜が、各PRNGアルゎリズムたたはその逆関数の遷移関数ず十分に異なるこずを確認する必芁があり、おそらく他のこずを確認する必芁がありたす。 私は、蚀う、から構築されたものを䜿甚したいずは思わないでしょうwyhash初期化するためにwyrand 。 あなたが蚀うように、あなたはそれ自身のためにビットを提䟛するためにPRNG自䜓を䜿甚したくありたせん。 そのため、すべおのPRNGに぀いおそれを保蚌するためにいく぀かの調査が必芁だず思いたす自分で行う必芁がないこずを望んでいた調査。

䞀方、 new_state = seed_seq(old_state||streamID)は、この点で、耇数のストリヌムに察する_SeedSequence_の䜿甚目的よりも悪くない可胜性がありたす。2぀の状態を順番に匕き出したす。 もしそうなら、私はC ++の経隓に頌っお、おそらくあなたの実装で、そしお私たちのすべおのアルゎリズムに぀いおPractRandでいく぀かの経隓的テストを行っお、それらがシングルストリヌムの察応物より悪くないこずを瀺しおも倧䞈倫でしょう。

ハッシュゞャンプを機胜させるず、PRNGを調敎なしで生成するためのいく぀かのナヌスケヌスが開かれるため、非垞に䟿利です。 ストリヌムIDを䜿甚するには、通信たたは事前割り圓おが必芁です。 daskは過去にこのようなものを求めおきたした。

正しいこずを行うのに䟿利な、適切なシヌドのみに䟝存する適切な代替手段がある堎合は、デフォルトの遞択基準ずしお蚭定可胜なストリヌムを削陀する必芁がありたす。 十分に倧きな状態空間を持぀デフォルトのアルゎリズムが必芁です。

ずはいえ、 63ビットのハッシュを䜿甚しおシヌケンシャルストリヌムID range(N) からPCG32増分を導出するこずは機胜しおいるように芋えたす。 8192のむンタヌリヌブされたストリヌムは、PractRandを2TiBに枡したす。 PCGゞェネレヌタヌのストリヌムIDを公開する堎合は、他の手段を䜿甚しお独立したストリヌムを再珟可胜に取埗するこずを提案したずしおも、この手法を䜿甚しお増分を導出するこずをお勧めしたす。

私があたりはっきりしおいないのは、初期化されたPRNGの珟圚の状態を取埗し、ストリヌムIDでハッシュミックスしお、サむクル内の新しい状態にゞャンプするこずがどれほど安党かずいうこずです。これは、あなたが提案しおいるず思っおいたものです埌で私はそれに぀いお間違っおいたかもしれないず思いたした。

私はおそらく曖昧に自分自身を衚珟したしたが、いいえ、PRNGの珟圚の状態を自己再シヌドに䜿甚するこずを提案する぀もりはありたせんでした。

しかし、FWIW、SplitMixはこれを行いたす。これは、 split()操䜜が行うこずです。 そしお、私はそれがそれをするのが奜きではありたせん。

これは情報が倚すぎるかもしれたせんが、SplitMixのsplit()関数によっお私が恐怖を感じたおそらく私が本来よりも恐怖を感じた理由に぀いお少しお話ししたす。 歎史的なメモずしお、SplitMixずPCGはほが同時に独立しお蚭蚈されたしたSplitMixは2014幎10月20日に公開されたしたが、 pcg-random.orgは2014幎8月に公開され、2014幎9月5日にPCGペヌパヌにリンクされたした。 PCGずSplitMixおよびVignaのxor shift *やxorshift +を含む他のさたざたなPRNG— 2014幎に䞖界にリリヌスされたものの間にはいく぀かの類䌌点がありたす。 すべおに、スクランブリング出力関数によっお修正された、かなり単玔な、十分ではない状態遷移関数がありたす。 私がPCGの論文を曞いおいるずき、䞀郚の人々が望んでいるこずを知っおいたのはsplit()関数でしたが、それを行うための良い方法を芋぀けるこずができたせんでした。 代わりに、各ステップで巊たたは右に移動できる_k_ビットPRNGがある堎合、_k_ステップ内で、以前の状態に到達できる必芁があるずいう簡単な蚌明を䜜成したした。これにより、コンセプト党䜓が蚌明されたす。思いがけなかった。 その芳察はそれを論文に入れたせんでした。 しかし、その蚌明の前に私の考えを熟考した結果、論文の最終ドラフトに近い脚泚で、PCGの出力はその状態のハッシュ/スクランブル/順列であったため、少し気たぐれに提案したした。いたずらを感じたら、ゞェネレヌタヌを独自の出力で再シヌドしお、それを回避するこずができたす。 PRNGを独自の状態で再シヌドするこずは、PRNGの誀甚の䞀皮であるず広く考えられおいたため、このような気たぐれはレビュヌ担圓者にずっお赀旗には倧きすぎるず考えたため、最終バヌゞョンから削陀したした。それらを䜿甚した経隓のない人々から私たちが芋るものの。

SplitMixの論文を読んで、奜きなものがたくさん芋぀かりたしたが、 split()を芋お、ずおもびっくりしたした。 それは私が基本的に冗談だず思っおいた䜕かをしお、それをビッグむベントにしたした。 数幎埌、私はあなたがこの皮の操䜜をしおいるずきに䜕が起こるかに぀いおより技術的な深さで曞くこずに取り掛かりたした。

党䜓的なポむントは、状態空間が十分に倧きい堎合そしお、SplitMixはほずんど十分ではない堎合、ハッシュ関数を介した自己再シヌドで回避できる可胜性があるずいうこずです。 これは良い考えではないず今でも感じおいたす。 ランダムマッピングこの状況で扱っおいるものには、「挞近確率がれロではないため、関数グラフの最も高いツリヌが最も長いサむクルに根ざしおいない」などのプロパティがあるため、完党な信頌を埗るのは難しいず思いたす。蚭蚈者がそのような病状が蚭蚈に存圚しないこずを瀺すために必芁な䜜業に行っおいない限り。

楜しみのために、SplitMixの小さなバヌゞョンの状態空間のダンプを次に瀺したす。 next()ずsplit()を組み合わせる3぀の異なるそしお厳密に固定された方法を探っおいたす。

Testing: SplitMix16: void advance() { rng = rng.split();}

Finding cycles...
- state 00000000 -> new cycle 1, size 4, at 000043b0 after 516 steps
- state 00000050 -> new cycle 2, size 41, at 00002103 after 2 steps
- state 000000cd -> new cycle 3, size 4, at 0000681a after 6 steps
- state 00000141 -> new cycle 4, size 23, at 00004001 after 11 steps
- state 00000dee -> new cycle 5, size 7, at 00007436 after 4 steps
- state 00008000 -> new cycle 6, size 90278, at 5e5ce38c after 46472 steps
- state 00030000 -> new cycle 7, size 6572, at 12c65374 after 10187 steps
- state 00030016 -> new cycle 8, size 3286, at 65d0fc0c after 402 steps
- state 00058000 -> new cycle 9, size 17097, at 2a2951fb after 31983 steps
- state 08040000 -> new cycle 10, size 36, at 08040000 after 0 steps
- state 08040001 -> new cycle 11, size 218, at 08040740 after 360 steps
- state 08040004 -> new cycle 12, size 10, at 38c01b3d after 107 steps
- state 08040006 -> new cycle 13, size 62, at 38c013a0 after 39 steps
- state 08040009 -> new cycle 14, size 124, at 08045259 after 24 steps
- state 08040019 -> new cycle 15, size 32, at 38c06c63 after 151 steps
- state 08040059 -> new cycle 16, size 34, at 38c00217 after 17 steps
- state 08040243 -> new cycle 17, size 16, at 38c06e36 after 13 steps
- state 123c8000 -> new cycle 18, size 684, at 77d9595f after 194 steps
- state 123c8002 -> new cycle 19, size 336, at 5de8164d after 141 steps
- state 123c9535 -> new cycle 20, size 12, at 123c9535 after 0 steps
- state 139f0000 -> new cycle 21, size 545, at 743e3a31 after 474 steps
- state 139f0b35 -> new cycle 22, size 5, at 139f0b35 after 0 steps
- state 139f1b35 -> new cycle 23, size 5, at 68d3c943 after 8 steps

Cycle Summary:
- Cycle 1, Period 4, Feeders 32095
- Cycle 2, Period 41, Feeders 188
- Cycle 3, Period 4, Feeders 214
- Cycle 4, Period 23, Feeders 180
- Cycle 5, Period 7, Feeders 12
- Cycle 6, Period 90278, Feeders 1479024474
- Cycle 7, Period 6572, Feeders 102385385
- Cycle 8, Period 3286, Feeders 5280405
- Cycle 9, Period 17097, Feeders 560217399
- Cycle 10, Period 36, Feeders 413
- Cycle 11, Period 218, Feeders 51390
- Cycle 12, Period 10, Feeders 1080
- Cycle 13, Period 62, Feeders 4113
- Cycle 14, Period 124, Feeders 4809
- Cycle 15, Period 32, Feeders 2567
- Cycle 16, Period 34, Feeders 545
- Cycle 17, Period 16, Feeders 87
- Cycle 18, Period 684, Feeders 95306
- Cycle 19, Period 336, Feeders 100263
- Cycle 20, Period 12, Feeders 7
- Cycle 21, Period 545, Feeders 163239
- Cycle 22, Period 5, Feeders 12
- Cycle 23, Period 5, Feeders 34

- Histogram of indegrees of all 2147483648 nodes:
      0  529334272
      1 1089077248
      2  528875520
      3     131072
      4      65536
Testing: SplitMix16: void advance() { rng.next(); rng = rng.split();}

Finding cycles...
- state 00000000 -> new cycle 1, size 36174, at 6b34fe8b after 21045 steps
- state 00000002 -> new cycle 2, size 4300, at 042a7c6b after 51287 steps
- state 0000000f -> new cycle 3, size 11050, at 0b471eb5 after 4832 steps
- state 0000001d -> new cycle 4, size 38804, at 2879c05c after 16280 steps
- state 00000020 -> new cycle 5, size 4606, at 46e0bdf6 after 7379 steps
- state 00046307 -> new cycle 6, size 137, at 0a180f87 after 89 steps
- state 00081c25 -> new cycle 7, size 16, at 177ed4d8 after 27 steps
- state 0044c604 -> new cycle 8, size 140, at 5e1f125b after 44 steps
- state 006e329f -> new cycle 9, size 18, at 006e329f after 0 steps
- state 13ebcefc -> new cycle 10, size 10, at 13ebcefc after 0 steps

Cycle Summary:
- Cycle 1, Period 36174, Feeders 975695553
- Cycle 2, Period 4300, Feeders 766130785
- Cycle 3, Period 11050, Feeders 110698235
- Cycle 4, Period 38804, Feeders 251133911
- Cycle 5, Period 4606, Feeders 43723200
- Cycle 6, Period 137, Feeders 4101
- Cycle 7, Period 16, Feeders 172
- Cycle 8, Period 140, Feeders 2310
- Cycle 9, Period 18, Feeders 124
- Cycle 10, Period 10, Feeders 2

- Histogram of indegrees of all 2147483648 nodes:
      0  529334272
      1 1089077248
      2  528875520
      3     131072
      4      65536
Testing: SplitMix16: void advance() { rng.next(); rng = rng.split(); rng = rng.split();}

Finding cycles...
- state 00000000 -> new cycle 1, size 40959, at 0069b555 after 49520 steps
- state 00000031 -> new cycle 2, size 1436, at 5f619520 after 2229 steps
- state 000003a4 -> new cycle 3, size 878, at 18d1cb99 after 1620 steps
- state 0000046c -> new cycle 4, size 2596, at 46ba79c0 after 1591 steps
- state 0000c6e2 -> new cycle 5, size 24, at 0212f11b after 179 steps
- state 000af7c9 -> new cycle 6, size 61, at 40684560 after 14 steps
- state 00154c16 -> new cycle 7, size 110, at 29e067ce after 12 steps
- state 0986e055 -> new cycle 8, size 4, at 2b701c82 after 7 steps
- state 09e73c93 -> new cycle 9, size 3, at 352aab83 after 1 steps
- state 19dda2c0 -> new cycle 10, size 1, at 78825f1b after 2 steps

Cycle Summary:
- Cycle 1, Period 40959, Feeders 2129209855
- Cycle 2, Period 1436, Feeders 5125630
- Cycle 3, Period 878, Feeders 7077139
- Cycle 4, Period 2596, Feeders 5997555
- Cycle 5, Period 24, Feeders 24221
- Cycle 6, Period 61, Feeders 1774
- Cycle 7, Period 110, Feeders 1372
- Cycle 8, Period 4, Feeders 23
- Cycle 9, Period 3, Feeders 4
- Cycle 10, Period 1, Feeders 3

- Histogram of indegrees of all 2147483648 nodes:
      0  829903716
      1  684575196
      2  468475086
      3  132259769
      4   32192209
      5      58402
      6      17026
      7       1982
      8        261
      9          1
Testing: SplitMix16: void advance() { rng.next(); rng.next(); rng = rng.split();}

Finding cycles...
- state 00000000 -> new cycle 1, size 55038, at 3e57af06 after 30005 steps
- state 00000005 -> new cycle 2, size 376, at 4979e8b5 after 6135 steps
- state 0000001e -> new cycle 3, size 10261, at 0cd55c94 after 1837 steps
- state 0000002d -> new cycle 4, size 3778, at 7f5f6afe after 3781 steps
- state 00000064 -> new cycle 5, size 2596, at 3bc5404b after 5124 steps
- state 0000012b -> new cycle 6, size 4210, at 525cc9f3 after 397 steps
- state 00000277 -> new cycle 7, size 1580, at 410010c8 after 1113 steps
- state 00001394 -> new cycle 8, size 916, at 7b20dfb0 after 193 steps
- state 00063c2d -> new cycle 9, size 51, at 6e92350b after 121 steps
- state 058426a6 -> new cycle 10, size 8, at 058426a6 after 0 steps
- state 0e5d412d -> new cycle 11, size 1, at 0e5d412d after 0 steps
- state 4c2556c2 -> new cycle 12, size 1, at 4c2556c2 after 0 steps

Cycle Summary:
- Cycle 1, Period 55038, Feeders 2027042770
- Cycle 2, Period 376, Feeders 28715945
- Cycle 3, Period 10261, Feeders 49621538
- Cycle 4, Period 3778, Feeders 13709744
- Cycle 5, Period 2596, Feeders 15367156
- Cycle 6, Period 4210, Feeders 10418779
- Cycle 7, Period 1580, Feeders 1782252
- Cycle 8, Period 916, Feeders 744273
- Cycle 9, Period 51, Feeders 2351
- Cycle 10, Period 8, Feeders 24
- Cycle 11, Period 1, Feeders 0
- Cycle 12, Period 1, Feeders 0

- Histogram of indegrees of all 2147483648 nodes:
      0  529334272
      1 1089077248
      2  528875520
      3     131072
      4      65536

等

ああ、すごい。 私は数幎前に自分でそれらの線に沿っおいく぀かの提案を打ち萜ずしたので、私たちは䜕か良いものを逃したのではないかず心配したした。 :-)

PCGストリヌムの増分を導出するためのハッシュアプ​​ロヌチに関する最終的な考えはありたすか それが独立したストリヌムを取埗するための䞻なメカニズムであるかどうかはさおおき。 その機胜ぞのアクセスを完党に削陀するこずを陀けば、それは、誀甚されやすいシヌケンシャルストリヌムIDを防ぐために私たちがやりたいこずのように思えたす。

奜奇心から、PCG64で2぀の状態がどれだけ離れおいるかを知る簡単な方法はありたすか

はい、公開しおいたせんが http 

奜奇心から、PCG64で2぀の状態がどれだけ離れおいるかを知る簡単な方法はありたすか

はい、公開しおいたせんが http 

C ++゜ヌスでは、distance関数はストリヌム間の距離も瀺し、最も近いアプロヌチのポむントを瀺したすストリヌム間の唯䞀の違いは远加された定数です。

ちなみに、基瀎ずなるLCGの堎合、距離を䜿甚しお、䜍眮ずの盞関関係を蚈算できたす。 短い距離は明らかに悪いですそしおPRNGにはたったく悪いですが、1ビットを蚭定しただけの距離も良くありたせん。そのため2 ^ 64 0x10000000000000000 にゞャンプしたす。 .jumpedは悪い考えです。 私のPCGのやるこずリストには、2぀の状態間の距離を調べ、距離がどれほどランダムに芋えるかを瀺す「 independence_score 」関数を蚘述しおいたすハミング重みなどを䜿甚したす。理想的には、玄半分が必芁です。ビットは0ず半分になり、それらは自由に分散されたす。

PCG64でjumpedを_keep_する1぀の方法は、 n * 0x10000000000000000ゞャンプするのでn * 0x9e3779b97f4a7c150000000000000000なく、 .jumped(3).jumped(5) == .jumped(8) が埗られたす。

「 0x10000000000000000進んではいけない」ずいうのは「たあ、そのように反応しないでください」ずいうこずも承知しおindependence_scoreが存圚する可胜性があるのは

PCGストリヌムの増分を導出するためのハッシュアプ​​ロヌチに関する最終的な考えはありたすか それが独立したストリヌムを取埗するための䞻なメカニズムであるかどうかはさおおき。 その機胜ぞのアクセスを完党に削陀するこずを陀けば、それは、誀甚されやすいシヌケンシャルストリヌムIDを防ぐために私たちがやりたいこずのように思えたす。

Murmur3ミキサヌに通すこずをお勧めしたす。 意図的な努力なしに、誀っお同様のストリヌムを䜜成する可胜性はありたせん。 線集128ビットバヌゞョンが必芁だず思いたすが、䞊半分ず䞋半分を混圚させるこずもできたす。定数も远加したす。誰もが0x9e3779b97f4a7c15f39cc0605cedc835 ϕの小数郚分を愛しおいたすが、 0xb7e151628aed2a6abf7158809cf4f3c7 eの小数郚分も問題ありたせん。たたは、ランダムに芋える数です。

wyhashhttps://github.com/wangyi-fudan/wyhashは、BigCrushずPractRandを通過した最速で最も単玔なものなので、お勧めしたす。 cコヌドは次のように単玔です

inline  uint64_t    wyrand(uint64_t *seed){    
    *seed+=0xa0761d6478bd642full;    
    __uint128_t t=(__uint128_t)(*seed^0xe7037ed1a0b428dbull)*(*seed);    
    return  (t>>64)^t;    
}

@ wangyi-fudan、これが党単射だず自分に玍埗させるこずはできたせん。

私の限られた知識で申し蚳ありたせんなぜPRNGに党単射が必芁/奜たれるのですか
いく぀かの説明に感謝したす- @ imneme

@ wangyi-fudan、64ビットintから64ビットintぞのハッシュ関数が党単射でない堎合぀たり、1察1の関数、䞀郚の結果は耇数回生成され、䞀郚はたったく生成されたせん。 それは䞀皮のバむアスです。

䜕が蚀いたいのか理解した。 ただし、64ビットの乱数ゞェネレヌタヌRの堎合、1.2 * 2 ^ 32の乱数http://mathworld.wolfram.com/BirthdayAttack.htmlの埌に1回の衝突が予想されたす。 2 ^ 64の乱数では、倚くの衝突が発生するのは自然なこずです。 衝突は自然ですが、党単射は自然にランダムではありたせん。 ギャンブルテヌブルたずえば、3ビットPRNGが8トレむル内で0の倀であるず刀断された堎合、5぀の非れロを芳察した埌、あえおれロに倧きな賭けをしたす。

@ wangyi-fudan、このコンテキストでは、ストリヌムIDを䞊べ替えお、1,2,3のようなストリヌムがよりランダムに芋えるようにする方法に぀いお話しおいたした別名、より正垞。 このプロセスでの衝突には矎埳はありたせん。

䞀般的なPRNGの堎合、ランダムマッピングに基づくPRNGずランダム可逆マッピング1察1関数に基づくPRNGの違いを確認する必芁がありたす。 私はそれに぀いお曞きたしたが、他の人もそうです。 サむズが小さいため、ランダムマッピングに基づくPRNGはバむアスを瀺し、他の手法に基づくPRNGよりも早く倱敗したす。 サむズが倧きいず、あらゆる皮類の欠陥を怜出するのが難しくなる可胜性がありたす。

_n_間隔を芁求した堎合に、ある間隔が別の間隔ず重なる確率を蚈算できたす。 それはかなり基本的な確率です—私が理解しおいるように初等数孊を含む論文に誰も興奮しおいないので、それに぀いお論文を発衚できるかどうかはわかりたせん。

私はあなたがピ゚ヌル・レクむダヌでなければならないず思いたす。 ;-) 15ペヌゞ

はい、圌が基本を説明するずき、それは倧䞈倫だず考えられたす

@rkern @imnemeシンプルさは、゜フトりェアず数孊の䞡方の機胜です。 単玔な䜜業に感銘を受けない人もいるずいうこずは、矛盟した蚌拠ず芋なされるべきではありたせん。

@lemire  _コンピュヌタヌ科孊者を批刀する方法_ず呌ばれる、私が奜きなナヌモアの䜜品がたくさんありたす。 この䜜品の背埌にある根本的な考え方は、理論家は掗緎を奜み、実隓家は単玔さを奜むずいうものです。 したがっお、聎衆が実隓家の1人である堎合、圌らは単玔さに喜ぶでしょうが、聎衆が理論家の1人である堎合、それほど倚くはありたせん。

デフォルトのBitGeneratorはPCG64です。 思いやりのある貢献をありがずうございたした。 そしおスタミナ

このスレッドに非垞に觊発されお、私は報告するいく぀かのニュヌスがありたす 

バックグラりンド

倚くの点で、 pcg64はかなり良いです。 たずえば、統蚈的品質の通垞の枬定では、クリヌンな健康状態が埗られたす。 さたざたな方法でテストされおいたす。 最近では、PractRandを䜿甚しお半ペタバむトたで実行したした。 通垞のナヌスケヌスでうたく機胜したす。

しかし、このスレッドで発生した病状は私にはよく合いたせんでした。 確かに、「たあ、そのように保持しないでください」

それで、玄25日前に、PCGファミリヌの新しいメンバヌを蚭蚈するこずを考え始めたした 

ゎヌル

私の目暙は、珟圚のpcg64バリアントの代わりになる可胜性のある新しいPCGファミリヌメンバヌを蚭蚈するこず

  • 出力関数は、XSL RRよりも倚くのビットをスクランブルする必芁がありたすそうするこずで、このスレッドで発生した問題を回避できるため。
  • パフォヌマンスは、珟圚のpcg64ずほが同じくらい速いたたは速いはずです。
  • 蚭蚈はPCG颚である必芁がありたす぀たり、簡単に予枬できないため、出力関数の䜜業を簡単に元に戻すこずはできたせん。

い぀ものように、できるだけ早く最高の品質を埗ようずするため、トレヌドオフがありたす。 速床をたったく気にしない堎合は、出力関数にさらに倚くのステップを远加しお、より高床にスクランブルされた出力を生成できたすが、PCGのポむントは、基盀ずなるLCGが「ほが十分」であるため、必芁ありたせんでした。 1ず぀増加するカりンタヌのようなもので行うのず同じくらい倚くの努力をしたす。

ネタバレ

成功を報告できるこずをうれしく思いたす。 私が最初にこれに぀いお考えおいた玄25日前、私は実際に䌑暇䞭でした。 箄10日前に戻ったずき、自分が持っおいたアむデアを詊しおみたずころ、うたく機胜しおいるこずがわかりたした。 その埌の時間は、䞻にさたざたな皮類のテストに費やされたした。 昚日は十分満足しおいたので、コヌドをC ++バヌゞョンのPCGに

詳现

FWIW、新しい出力関数は次のずおりです64ビット出力の堎合

uint64_t output(__uint128_t internal)
{
    uint64_t hi = internal >> 64;
    uint64_t lo = internal;

    lo |= 1;
    hi ^= hi >> 32;
    hi *= 0xda942042e4dd58b5ULL;
    hi ^= hi >> 48;
    hi *= lo;
    return hi;
}

この出力関数は、広く䜿甚されおいるxorshift-multiplyに觊発されおいたす。 乗数の遞択は、aマゞック定数の数を抑えるこず、およびb順列が元に戻されないようにするこず䞋䜍ビットにアクセスできない堎合であり、「ランダム化された- PCG出力関数が通垞持぀「それ自䜓」の品質。

その他の倉曎

0xda942042e4dd58b5がこのPRNGおよびすべおのcm_プレフィックス付き128ビット状態PCGゞェネレヌタヌのLCG乗数である堎合もありたす。 比范するず0x2360ed051fc65da44385df649fccf645で䜿甚されるpcg64 、この定数は、分光詊隓性の点ではただ実際にはかなり良いですが、128ビット×64ビットよりも簡単であるため、乗算によるず安いです128ビット×128ビット。 私はこのLCG定数を数幎間問題なく䜿甚しおきたした。 安䟡な乗数バリアントを䜿甚する堎合、呜什レベルの䞊列性を高めるために、出力関数を反埩埌の状態ではなく反埩前の状態で実行したす。

テスト

私はそれを培底的にテストしPractRandずTestU01、満足しおいたす。 テストには、このスレッドで抂説されおいるシナリオが含たれおいたしたたずえば、ギャングゞェネレヌタヌをシヌケンシャルスチヌムで䜿甚するか、2 ^ 64だけ進めお、出力をむンタヌリヌブしたす—4぀のギャングず8192のギャングを8TBたで問題なくテストしたした。ストリヌムずその反察偎の土地の察応物ずしお。

速床

速床テストずベンチマヌクに぀いお詳しく説明するこずができたした。 特定のベンチマヌクで、あるPRNGが別のPRNGよりも速く実行されるかどうかに圱響を䞎えるさたざたな芁因がありたすが、党䜓ずしお、このバリアントは、倚くの堎合、少し速く、時にははるかに速く、時には少し遅くなるようです。 コンパむラやアプリケヌションなどの芁因は、ベンチマヌクの倉動性にはるかに倧きな圱響を及がしたす。

可甚性

C ++ヘッダヌのナヌザヌは、この新しいファミリメンバヌに_now_ずしおpcg_engines::cm_setseq_dxsm_128_64ずしおアクセスできたす。 将来のある時点で、 pcg64をpcg_engines::setseq_xsl_rr_128_64からこの新しいスキヌムに切り替えたす。 私の珟圚の蚈画は、PCG2.0バヌゞョンのバンプの䞀郚ずしお今幎の倏にそうするこずです。

正匏な発衚

党䜓ずしお、私はこの新しい家族にずおも満足しおいたす。倏の埌半のある時点で、このスレッドを参照しおいる可胜性が高い、より詳现なブログ投皿がありたす。

あなたの遞択...

もちろん、これをどうするかを考えなければなりたせん。 あなたがそれを䜿うかどうかに関係なく、私は実際にあなたの速床ベンチマヌクでそれが良くなるか悪くなるかを芋るためにかなり興味がありたす。

@imneme高速のフル64ビット乗算噚が必芁になるのを回避できたすか これはx64では超高速ですが、䞀郚の匱いアヌキテクチャでは少し遅くなりたす。

@lemire 128ビット×64ビットの乗算。これは、x86で2぀の乗算呜什を䜿甚しお内郚的に実行されたす䞋䜍ビットで64ビット×64ビット→128ビットの結果、および64ビット×64 -䞊䜍ビットのビット。䞡方の乗算を䞊行しお実行できるため、2぀の結果を加算する必芁がありたす。

それでも、128ビット×128ビットよりも優れおいる可胜性がありたす。 どれだけ良くなるかは、その時点で呜什スケゞュヌリングがどれだけうたくいくかに䟝存したすが。

ARMでは、64ビット×64ビット→128ビットの結果は実際には2぀の呜什です。

もちろん、2぀の64ビットLCGを組み合わせお、それらを混合するこずは完党に可胜です。存圚する可胜性があり、うたく機胜するすべおのPRNGのスペヌスはかなり巚倧です。

私たちのフレヌムワヌクでの迅速で汚い実装は、少なくずも64ビットLinuxでは、パフォヌマンスがわずかに向䞊するこずを瀺唆しおいたす。

Time to produce 1,000,000 64-bit unsigned integers
************************************************************
MT19937      5.42 ms
PCG64        2.59 ms
PCG64DXSM    2.41 ms
Philox       4.37 ms
SFC64        2.07 ms
numpy        5.41 ms
dtype: object

64-bit unsigned integers per second
************************************************************
MT19937      184.39 million
PCG64        386.01 million
PCG64DXSM    415.02 million
Philox       228.88 million
SFC64        483.94 million
numpy        184.79 million
dtype: object

少なくずもこのコンテキストでは、バンプを䞎える事前反埩状態から出力しおいるず思いたす。 最初はそれを省略し、基本的にPCG64 1.0ず同じパフォヌマンスを埗たした。 本圓の勝利は128ビット゚ミュレヌションの䞋であるず私は思うが、それを曞き留めるこずができず、重芁なプラットフォヌムでそれをテストする良い方法がない。

@imnemeさんにずっおの本圓の質問は、1.0アルゎリズムを実装するnumpy.random.PCG64ずいう名前でどれほどむラむラするかずいうこずだず思いたす。 リリヌスは間近で、すでに遅れおいるので、珟時点ではアルゎリズムを倉曎する぀もりはありたせん。 32ビットプラットフォヌムでのパフォヌマンスが特に優れおいる堎合は、次のリリヌスでPCG64DXSMを远加し、数リリヌス埌にデフォルトを再怜蚎する可胜性があるず思いたす。

それはあなたの遞択です

PCG64の1.0バヌゞョンの発送に問題はありたせん。 他の倚くの人々がその倉皮を䜿甚しおいたす。

DXSMバリアントには、このスレッドで発生した゚ッゞケヌス䜿甚の問題を回避できるずいう利点があるず思いたすが結局のずころ、それが存圚する理由はほずんどありたす、䞀方で、遅れるずいう欠点がありたす。パヌティヌ。 1か月未満のPRNGをナヌザヌに出荷するのは非垞に無謀に思えるかもしれたせんこれは、より実瞟のあるPCGバリアントず同じアむデアに基づいおいたすが。

ずはいえ、無謀さの可胜性があるずの非難にもかかわらず、それが_my_の遞択だった堎合は、おそらく新しいものを出荷したす。Numpyで起動しお実行するたでの遅延はごくわずかだず思いたす。リスクは非垞に䜎く、すでにBigCrushで培底的にテストされ、PractRandで16 TBたでテストされサむズの4分の1であるcm_mcg_dxsm_64_32を含む[ストリヌムなし、32ビット出力]、1週間以内に32TBに

[パフォヌマンスが少し良くなったのはうれしい。 5幎前、事前反埩状態の䜿甚は、128ビット乗数を䜿甚した128ビットサむズの悲芳論でした。 しかし、それは、私がテストしおいたマシンで、私が䜿甚しおいたベンチマヌクでした。]

2.0バリアントを参照するためにその名前を䜿甚する堎合は、1.0バリアントにPCG64ずいう名前を䜿甚するこずに぀いお詳しく説明したした。

@rkernそれが単なる呜名の問題である堎合、PCG64DXSMずPCG64はそれらをうたく区別したすね。

し぀こい人にずっおは、確かに。 @imnemeが、C ++バヌゞョンでその名前で2.0バリアントをプロモヌトするずきに、1.0実装にPCG64ずいう名前を付けないこずを奜むかどうか疑問に思っおいたす。 私は、名前が緩いずいうこずは、䞀郚の人々がnumpyのPCG64をテストし、それを2.0バヌゞョンに぀いおpcg-random.orgで行われる䞻匵ず比范する可胜性があるずいう事実に敏感です。 ボブ・ゞェンキンのPRNGに぀いおのほがすべおの䌚話を参照しおください。

PCGペヌパヌのセクション6.3には、次のように曞かれおいたす。

ゞェネレヌタヌには、実行する順列に基づいたニヌモニック名が衚瀺されたすが、PCGラむブラリのナヌザヌがこれらのニヌモニックによっおファミリヌメンバヌを遞択するこずはめったにないこずにも泚意しおください。 ラむブラリは、基盀ずなる実装ではなく、プロパティに基づいお名前付きゞェネレヌタヌを提䟛したすたずえば、䞀意のストリヌムを持぀汎甚32ビットゞェネレヌタヌの堎合はpcg32_unique。 そうすれば、パフォヌマンスがさらに向䞊する将来の家族が発芋されお远加されたずきにできれば他の人の発芋のために、ナヌザヌはシヌムレスにそれらに切り替えるこずができたす。

そしお、CおよびC ++ラむブラリはそのように構成されおいたす。 ラむブラリは提䟛したす

  • 順列の名前、動䜜するビットサむズ、および基になるLCGの特性を介しお、特定のファミリメンバヌを遞択できる䜎レベルのむンタヌフェむス
  • 事前に遞択された䜎レベルのファミリメンバヌに接続するpcg64ような䟿利な゚むリアスを提䟛する高レベルのむンタヌフェむス。

このようにしお、゚むリアスを曎新しお新しい家族を指すようにするこずができたすが、叀い結果を正確に再珟したいナヌザヌは、䜎レベルのむンタヌフェむスを䜿甚しお、以前は䟿利な高さで到達できた家族を遞択するこずができたす。 -レベルの゚むリアス。

PCG64ずいうPRNGを出荷する堎合は、ドキュメントで、どの特定のPCGバリアントであるか、぀たり、どのファミリメンバヌに察応するかを䜎䜍で瀺すだけで十分だず思いたす。 -レベルCたたはC ++ラむブラリむンタヌフェむス。

デフォルトのゞェネレヌタヌは、 https//github.com/numpy/numpy/pull/13840でnp.random.default_gen()ずしお実装されおいたす。 将来の参照のために@ rkern 、PRを明瀺的に呌び出すこずはおそらく良いこずです-バックリンクを提䟛するだけの堎合、通知がないため、GitHubでそれらを芋逃しがちです。

1぀のマむナヌな問題代わりにこれをnp.random.default_generator()ず呌ぶのはどうですか genは、私には短すぎる/自明ではないず感じおいたす。 他の人の考えが気になりたす。

代わりにこのnp.random.default_generatorを呌び出すのはどうですか

同じ考えnp.random.default_generator()が、 default_rng遊んでみたした。

👍私のようなdefault_rngより良いdefault_genあたりにも、。 私はただdefault_generator傟いおいたすが、これらのいずれかに満足しおいたす。

+1 default_rng() 。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡