Numpy: Numpyが提䟛するPCGの実装には、重倧で危険な自己盞関がありたす

䜜成日 2020幎05月20日  Â·  104コメント  Â·  ゜ヌス: numpy/numpy

Numpyが䜿甚するPCGゞェネレヌタヌには、かなりの量の自己盞関がありたす。 ぀たり、シヌドから生成された各シヌケンスには、他のシヌドから開始する、盞関のある重耇しないシヌケンスが倚数ありたす。 「盞関」ずは、そのような2぀のシヌケンスをむンタヌリヌブし、結果をテストするず、各シヌケンスに個別に衚瀺されなかった障害が発生するこずを意味したす。

倚数の端末セットから2぀のゞェネレヌタヌがそれらのシヌケンスのうちの2぀を取埗する確率は無芖できたせん。 数孊的な芳点からこれが発生する理由はよく知られおいたすが、ここで詳现に説明されおいたす http  サブシヌケンス」を参照。

この問題を盎接瀺すために、Numpyコヌドを再利甚しおこの単玔なCプログラムを䜜成したした http 

./intpcgnumpy 0x596d84dfefec2fc7 0x6b79f81ab9f3e37b 0x8d7deae980a64ab0 0x6b79f81ab9f3e37b | stdbuf -oL〜 / svn / c / xorshift / practrand / RNG_test stdin -tf 2 -te 1 -tlmaxonly -multithreaded
PractRandバヌゞョン0.94を䜿甚したRNG_test
RNG = RNG_stdin、シヌド=䞍明
テストセット=拡匵、折りたたみ=远加

rng=RNG_stdin, seed=unknown
length= 128 megabytes (2^27 bytes), time= 2.2 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN(0+0,13-2,T)                  R= +27.6  p =  1.0e-13    FAIL
  BCFN(0+1,13-2,T)                  R= +68.0  p =  2.3e-34    FAIL !!!
  BCFN(0+2,13-3,T)                  R= +90.8  p =  8.8e-43    FAIL !!!
  BCFN(0+3,13-3,T)                  R=+120.6  p =  6.9e-57    FAIL !!!!
  DC6-6x2Bytes-1                    R=  +8.9  p =  4.0e-5   mildly suspicious
  DC6-5x4Bytes-1                    R= +15.7  p =  4.3e-9   very suspicious
  [Low1/8]BCFN(0+0,13-4,T)          R= +11.6  p =  4.9e-5   unusual
  ...and 1074 test result(s) without anomalies

䜎くするこずもできたす—同じ58個の䞋䜍ビットが必芁です。

./intpcgnumpy 0x596d84dfefec2fc7 0x0579f81ab9f3e37b 0x8d7deae980a64ab0 0x6b79f81ab9f3e37b | stdbuf -oL ~/svn/c/xorshift/practrand/RNG_test stdin -tf 2 -te 1 -tlmaxonly -multithreaded

[...]
rng=RNG_stdin, seed=unknown
length= 32 gigabytes (2^35 bytes), time= 453 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low1/16]FPF-14+6/32:cross        R= +11.6  p =  4.0e-10   VERY SUSPICIOUS
  [Low1/32]FPF-14+6/32:cross        R= +16.5  p =  3.2e-14    FAIL
  [Low1/32]FPF-14+6/16:cross        R= +12.8  p =  3.8e-11   VERY SUSPICIOUS
  [Low1/64]FPF-14+6/64:cross        R=  +6.8  p =  4.8e-6   mildly suspicious
  [Low1/64]FPF-14+6/32:cross        R=  +6.0  p =  1.9e-5   unusual
  [Low1/64]FPF-14+6/16:cross        R=  +5.5  p =  5.8e-5   unusual
  [Low4/32]FPF-14+6/64:all          R=  +5.8  p =  5.9e-5   unusual
  [Low4/32]FPF-14+6/32:(0,14-0)     R=  +7.7  p =  1.0e-6   unusual
  [Low4/32]FPF-14+6/32:(1,14-0)     R=  +7.7  p =  9.1e-7   unusual
  [Low4/32]FPF-14+6/32:all          R=  +6.5  p =  1.3e-5   unusual
  [Low4/64]FPF-14+6/64:all          R=  +5.9  p =  5.1e-5   unusual
  [Low4/64]FPF-14+6/64:cross        R=  +8.2  p =  3.0e-7   suspicious
  [Low4/64]FPF-14+6/32:(0,14-0)     R=  +7.6  p =  1.0e-6   unusual
  [Low8/64]FPF-14+6/64:(0,14-0)     R= +17.0  p =  2.2e-15    FAIL
  [Low8/64]FPF-14+6/64:(1,14-0)     R=  +9.1  p =  5.1e-8   mildly suspicious
  [Low8/64]FPF-14+6/64:all          R= +12.7  p =  2.1e-11   VERY SUSPICIOUS
  [Low8/64]FPF-14+6/32:(0,14-0)     R= +12.8  p =  1.7e-11   VERY SUSPICIOUS
  [Low8/64]FPF-14+6/32:all          R= +11.0  p =  9.3e-10   VERY SUSPICIOUS
  ...and 1696 test result(s) without anomalies

2぀のゞェネレヌタヌが2぀の盞関シヌドランダムに遞択から開始する確率を50以䞊取埗するには、ランダムに開始するゞェネレヌタヌが玄50䞇個必芁であるこずに泚意しおください誕生日のパラドックス。 そしお、それらが正確に同じ状態から開始するわけではないが、有意に重耇する盞関シヌケンスがある可胜性を考慮するず、必芁なものははるかに少なくなりたす。

文献からの賢明なゞェネレヌタヌは、そのように動䜜したせん。 逆に、MRG32k3a、SFC64、CMWC、xoshiro256 ++などの任意の2぀の開始状態を遞択できたす。重耇しないシヌケンスを生成する限り、䞊蚘の障害は発生したせん。 これは、倚くのデバむスがゞェネレヌタヌを䜿甚するずきに発生する可胜性のある倧きな欠点であり、ペアごずにこれらのシヌケンスが盞関関係を瀺すべきではないず想定したす。 盞関関係は、怜出が難しい望たしくない動䜜を匕き起こす可胜性がありたす。

少なくずも、ゞェネレヌタを耇数の端末や高床に䞊列化された環境で䜿甚しおはならないこずをどこかに文曞化しおください。

加法定数を倉曎するこずによっおLCGによっお生成されるシヌケンスは、笊号の倉曎ず加法定数を法ずしおすべお同じであるため、異なる「ストリヌム」でも同じこずが発生する可胜性がありたす。 ここでいく぀かの議論を芋るこずができたす https  https  //arxiv.org/abs/2001.05304 。

numpy.random

党おのコメント104件

@imneme、@bashtage、@rkernはここ圓局だろうが、私たちは、この䞊で行っおいるず思うし、私たちが奜適なぜそれがSeedSequence.spawn超えるむンタヌフェヌスjumped䞀぀。 たずえば、APIに぀いお話し合っおいたずきにhttps://numpy.org/devdocs/reference/random/parallel.htmlのアドバむスを確認し、必芁に応じお改善を提案しお

@mattipこれはゞャンプずは䜕の関係もありたせん。

ドキュメントを改善するこずは垞に良い考えですが、実際には倧芏暡な倉曎を加えるこずは難しいず思いたす。

私はおそらく掚薊AESCounter AES-NIたたはを持぀人のためのSPECK128 、高床に䞊列蚭定でなしに、誰のために。

加法定数を倉曎するこずによっおLCGによっお生成されるシヌケンスは、笊号の倉曎ず加法定数を法ずしおすべお同じであるため、異なる「ストリヌム」でも同じこずが発生する可胜性がありたす。

これを定量化できたすか 同じ増分を䜿甚しお障害を耇補できたすが、増分ず状態をシヌドし、2぀の異なるランダムな増分で障害をただ芳察しおいたせん。 増分も泚意深く䜜成する必芁がある堎合、それは実際の誕生日の衝突頻床に圱響したす。

https://gist.github.com/rkern/f46552e030e59b5f1ebbd3b3ec045759

❯ ./pcg64_correlations.py --same-increment | stdbuf -oL ./RNG_test stdin64 -tf 2 -te 1 -tlmaxonly -multithreaded
0x56b35656ede2b560587e4251568a8fed
0x93526034ed105e9e587e4251568a8fed
[
    {
        "bit_generator": "PCG64",
        "state": {
            "state": 115244779949650410574112983538102603757,
            "inc": 137507567477557873606783385380908979143
        },
        "has_uint32": 0,
        "uinteger": 0
    },
    {
        "bit_generator": "PCG64",
        "state": {
            "state": 195824235027336627448689568147458133997,
            "inc": 137507567477557873606783385380908979143
        },
        "has_uint32": 0,
        "uinteger": 0
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin64, seed = 0x4bf19f7b
test set = expanded, folding = extra

rng=RNG_stdin64, seed=0x4bf19f7b
length= 128 megabytes (2^27 bytes), time= 3.0 seconds
  Test Name                         Raw       Processed     Evaluation
  BCFN_FF(2+0,13-3,T)               R= +59.9  p =  3.8e-28    FAIL !!!       
  BCFN_FF(2+1):freq                 R= +89.0  p~=   6e-18     FAIL !         
  BCFN_FF(2+2):freq                 R= +39.6  p~=   6e-18     FAIL !         
  BCFN_FF(2+3):freq                 R= +14.6  p~=   6e-18     FAIL !         
  BCFN_FF(2+4):freq                 R= +10.3  p~=   5e-11   very suspicious  
  DC6-9x1Bytes-1                    R=  +7.1  p =  5.6e-4   unusual          
  DC6-6x2Bytes-1                    R= +18.9  p =  1.0e-10   VERY SUSPICIOUS 
  DC6-5x4Bytes-1                    R= +11.2  p =  1.4e-6   suspicious       
  [Low4/16]BCFN_FF(2+0):freq        R= +19.5  p~=   6e-18     FAIL !         
  [Low4/16]FPF-14+6/16:all          R=  +5.6  p =  1.0e-4   unusual          
  [Low4/16]FPF-14+6/4:all           R=  +5.9  p =  4.6e-5   unusual          
  [Low4/32]BCFN_FF(2+0):freq        R=  +6.5  p~=   2e-5    unusual          
  [Low8/32]BCFN_FF(2+0):freq        R= +15.1  p~=   6e-18     FAIL !         
  [Low8/32]FPF-14+6/32:all          R=  +8.4  p =  2.5e-7   very suspicious  
  [Low8/32]FPF-14+6/32:all2         R=  +9.0  p =  7.8e-5   unusual          
  [Low8/32]FPF-14+6/16:(0,14-0)     R= +12.4  p =  4.5e-11   VERY SUSPICIOUS 
  [Low8/32]FPF-14+6/16:all          R= +15.5  p =  5.2e-14    FAIL           
  [Low8/32]FPF-14+6/16:all2         R= +41.4  p =  2.6e-16    FAIL !         
  [Low8/32]FPF-14+6/4:(0,14-0)      R=  +6.9  p =  5.9e-6   unusual          
  [Low8/32]FPF-14+6/4:all           R=  +7.9  p =  6.6e-7   suspicious       
  ...and 871 test result(s) without anomalies

OK、もう䞀床やり盎したす。

2乗の係数を持぀LCGには耇数のストリヌムはありたせん。 倚くの人が初期の頃にそれを信じおいたした、そしおそれらの「ストリヌム」で面癜いこずをするず䞻匵する長い叀い論文さえありたす、しかし定数を倉えるこずによっおあなたが埗る軌道は_すべお同じモゞュロ加算であるこずが䜕十幎もの間知られおいたす定数で、堎合によっおは笊号の倉曎_。 私がそれをたどるこずができる最も遠いのは

Mark J. Durst、䞊列乱数生成に線圢合同法を䜿甚、
1989 Winter Simulation Conference Proceedings、IEEE Press、1989幎、462〜466ペヌゞ。

そこで、次のように蚭定できる別のプログラムhttp://prng.di.unimi.it/corrpcgnumpy.cを䜜成したした。

  • PRNGの初期状態。
  • 別のPRNGの初期状態。
  • 最初のPRNGの任意の「ストリヌム定数」。
  • 2番目のPRNGの任意の「ストリヌム定数」䞡方ずも偶数たたは䞡方ずも奇数である必芁がありたす。この制限は、远加の操䜜で削陀できたす。
  • 基本的に、最初のPRNGの同じビットで開始するように、2番目のPRNGで逆に蚭定する固定数の䞋䜍ビット。 残りのビットは、指定した2番目のPRNGの初期状態から取埗されたす。

぀たり、これは最初のプログラムの蚭定ですが、定数を遞択するこずもできたす。

./corrpcgnumpy 0x596d84dfefec2fc7 0x6b79f81ab9f3e37b 0xac9c8abfcb89f65f 0xe42e8dff1c46de8b 0x8d7deae9efec2fc7 0x6b79f81ab9f3e37b 0x06e13e5e8c92c843 0xf92e8346feee7a21 56 | stdbuf -oL ~/svn/c/xorshift/practrand/RNG_test stdin -tf 2 -te 1 -tlmaxonly -multithreaded

rng=RNG_stdin, seed=unknown
length= 4 gigabytes (2^32 bytes), time= 113 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low1/8]BCFN(0+0,13-1,T)          R= +27.2  p =  4.0e-14    FAIL
  [Low1/8]DC6-6x2Bytes-1            R= +10.9  p =  4.4e-6   suspicious
  [Low1/64]DC6-5x4Bytes-1           R=  -6.4  p =1-1.4e-4   unusual
  [Low8/64]FPF-14+6/64:(0,14-0)     R=  +8.4  p =  2.2e-7   mildly suspicious
  [Low8/64]FPF-14+6/64:all          R=  +8.7  p =  1.2e-7   suspicious
  [Low8/64]FPF-14+6/32:(0,14-0)     R= +10.2  p =  5.1e-9   suspicious
  [Low8/64]FPF-14+6/32:all          R=  +9.4  p =  2.7e-8   very suspicious
  [Low8/64]FPF-14+6/16:all          R=  +5.8  p =  6.4e-5   unusual
  ...and 1439 test result(s) without anomalies

したがっお、「ストリヌム定数」をどのように遞択しおも、同じ定数の堎合ずたったく同じように、少なくずも_ 2 ^ 72の盞関サブシヌケンスがありたす。

そしお、ゞェネレヌタヌにはずんでもない量のスラックが䞎えられたす。私が蚈算しおいる正確な開始点の代わりに、少し前埌の状態を䜿甚するずしおも、ずにかく盞関関係が衚瀺されたす。 これを行うための远加パラメヌタを䜿甚しお、プログラムを簡単に倉曎できたす。

繰り返したすが、科孊文献の既存の最新の発電機にはこのような動䜜はありたせんもちろん、2の环乗のLCGにはこの動䜜がありたすが、神のために、それは最新の発電機ではありたせん。

SabastianoのPCGに察する批刀は、2018幎のこのブログ投皿で取り䞊げられおいたす。

短いバヌゞョンでは、特定のシヌドを考案するこずが蚱可されおいる堎合、ほずんどすべおのPRNGから「芋栄えの悪い」動䜜を瀺すこずができたす。 PCGはどういうわけかナニヌクであるずいう圌の䞻匵にもかかわらず、実際にはPCGはかなり埓来型です。PCGのストリヌムは、たずえば、広く䜿甚されおいる別のPRNGであるSplitMixのストリヌムよりも悪くはありたせん。

それは完党に誀りです。 私が間違っおいるこずを蚌明するために、MRG32k3aたたはxoshiro256 ++からの2぀の盞関する重耇しないシヌケンスを瀺したす。

重耇しないず蚀ったこずはありたせん。 xoshiro256 ++で珟圚利甚可胜なテストを芋せおください。 2぀のシヌドが重耇を回避するこず。

察照的に、私はあなたが瀺した「盞関関係」が本質的に重耇の圢であるこずを瀺すPCGのテストを持っおいたす。

「本質的に」や「フォヌム」のようにFUDず戊うこずはできたせんが、 http//prng.di.unimi.it/intpcgnumpy.cを倉曎しお、最初に各PRNGを100億回繰り返し、゚ラヌで終了するようにしたした。生成されたシヌケンスが他のPRNGの初期状態を通過する堎合のメッセヌゞ。 これにより、Practrandぞの最初の160GBのデヌタが重耇しないシヌケンスからのものであるこずが保蚌されたす。

./intpcgnumpy 0x596d84dfefec2fc7 0x0579f81ab9f3e37b 0x8d7deae980a64ab0 0x6c79f81ab9f3e37b | stdbuf -oL ~/svn/c/xorshift/practrand/RNG_test stdin -tf 2 -te 1 -tlmaxonly -multithreaded
[...]
rng=RNG_stdin, seed=unknown
length= 64 gigabytes (2^36 bytes), time= 926 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low1/8]FPF-14+6/64:(0,14-0)      R=  +8.8  p =  8.7e-8   mildly suspicious
  [Low1/8]FPF-14+6/64:all           R=  +6.3  p =  2.1e-5   unusual          
  [Low1/16]FPF-14+6/64:(0,14-0)     R=  +7.6  p =  1.1e-6   unusual          
  [Low1/16]FPF-14+6/64:(1,14-0)     R=  +8.3  p =  2.9e-7   mildly suspicious
  [Low1/16]FPF-14+6/64:all          R=  +8.0  p =  5.8e-7   suspicious       
  [Low1/16]FPF-14+6/32:all          R=  +7.1  p =  3.9e-6   mildly suspicious
  [Low1/64]FPF-14+6/32:cross        R=  +7.1  p =  2.6e-6   mildly suspicious
  [Low4/32]FPF-14+6/64:(0,14-0)     R= +13.5  p =  4.3e-12   VERY SUSPICIOUS 
  [Low4/32]FPF-14+6/64:all          R=  +9.0  p =  5.9e-8   very suspicious  
  [Low4/64]FPF-14+6/64:(0,14-0)     R= +11.4  p =  3.8e-10  very suspicious  
  [Low4/64]FPF-14+6/64:all          R=  +8.0  p =  5.3e-7   suspicious       
  [Low4/64]FPF-14+6/32:(0,14-0)     R= +10.3  p =  3.6e-9   suspicious       
  [Low4/64]FPF-14+6/32:all          R=  +6.1  p =  3.2e-5   unusual          
  [Low8/64]FPF-14+6/64:(0,14-0)     R= +18.6  p =  8.4e-17    FAIL           
  [Low8/64]FPF-14+6/64:(1,14-0)     R= +11.4  p =  3.9e-10  very suspicious  
  [Low8/64]FPF-14+6/64:(2,14-0)     R=  +8.3  p =  2.8e-7   mildly suspicious
  [Low8/64]FPF-14+6/64:all          R= +15.3  p =  6.9e-14    FAIL           
  [Low8/64]FPF-14+6/32:(0,14-0)     R=  +7.8  p =  7.1e-7   unusual          
  [Low8/64]FPF-14+6/32:(1,14-0)     R=  +7.2  p =  2.7e-6   unusual          
  [Low8/64]FPF-14+6/32:all          R=  +5.8  p =  6.9e-5   unusual          
  ...and 1786 test result(s) without anomalies

この特定の初期化デヌタには56個の䞋䜍固定ビットしかないため、䞊䜍ビットを反転するこずで2 ^ 72個の盞関シヌケンスを生成できたす。 統蚈的な倱敗は、わずか64GBのデヌタの埌で発生し、オヌバヌラップが盞関の原因ではないこずを瀺しおいたす。 もちろん、他の特定のタヌゲットを絞った遞択肢では、64GBより前に重耇が発生する可胜性がありたす。これは特定の䟋です。 しかし、オヌバヌラップが問題ではないこずを簡単に確認できるようになりたした。ゞェネレヌタヌには、望たしくない内郚盞関がたくさんありたす。

行動芏範を尊重しおください。 「共感的で、歓迎的で、友奜的で、忍耐匷く」そしお「私たちが遞ぶ蚀葉に泚意しおください。私たちはコミュニケヌションに泚意深く敬意を払う」ずいう指瀺にあなたのコメントを調和させるようにしおください。

重耇しないず蚀ったこずはありたせん。 xoshiro256 ++で珟圚利甚可胜なテストを芋せおください。 2぀のシヌドが重耇を回避するこず。

ささいなこずです。ストリヌムの長さを決定し、繰り返し、2぀のストリヌムが初期状態ず亀差しないこずを確認したす。 これは、プログラムhttp://prng.di.unimi.it/intpcgnumpy.cで盞関PCGストリヌムが重耇しないこずを瀺すために䜿甚したのず同じコヌドです。

PCGはどういうわけかナニヌクであるずいう圌の䞻匵にもかかわらず、実際にはPCGはかなり埓来型です。PCGのストリヌムは、たずえば、広く䜿甚されおいる別のPRNGであるSplitMixのストリヌムよりも悪くはありたせん。

私芋、PCG内の自己盞関ははるかに悪いです。 LCGに関するダヌストの劇的な1989幎の結果に類䌌した、SplitMixむンスタンスの基瀎ずなる加法ゞェネレヌタヌの結果はありたせん。

しかし、SplitMixの非垞に軜床の問題は知られおおり、 JEP 356は、これらの問題に察凊しようずする新しいクラスの分割可胜ゞェネレヌタヌLXMを提䟛したす。 PCGに移り、欠陥の少ないものに亀換する時が来たした。

根本的な問題は䞡方のゞェネレヌタヌで知られおおり、状態の組み合わせが䞍足しおいるこずが原因です。 これらのゞェネレヌタヌの1぀の状態のビット_k_を倉曎した堎合、倉曎がビット_k_より䞋に䌝播するこずはありたせん。 これは、プラむムモゞュラスを持぀LCG、F2線圢ゞェネレヌタヌ、CMWCゞェネレヌタヌなどでは発生したせん。他のすべおのゞェネレヌタヌは、可胜な限り迅速か぀可胜な限り状態を混合しようずしたす。

PCGずSplitMixの問題を同䞀芖するこずは、真っ赀なニシンです。 SplitMixには、非垞に単玔な基瀎ずなるゞェネレヌタヌがあり、远加機胜がありたすが、それに加えお、非垞に匷力なスクランブリング関数がありたす。これは、ApplebyのMurmurHash3ハッシュ関数の64ビットファむナラむザヌであり、スタッフォヌドhttp://zimbry.blogspot.com/2011/09/better-bit-mixing-improving-on.htmlによっお改善されたした。 関数の定数は、特定の枬定可胜ななだれ特性を持぀ようにトレヌニングされおいたす。 少数のビットの倉曎でさえ、すべおの出力に広がる傟向がありたす。 蚀い換えれば、SplitMixは巚人の肩の䞊に立っおいたす。

それどころか、PCGゞェネレヌタヌの基瀎ずなるLCGにも同じ混合䞍足の問題がありたすが、スクランブリング関数は、理論的たたは統蚈的な保蚌なしに、䜜成者が組み立おた算術挔算ず論理挔算の単玔なシヌケンスです。 基瀎ずなるLCGのすべおのシヌケンスが、加法定数ず堎合によっおは笊号の倉化を法ずしお同じであるずいう事実に泚意しお考案されおいれば、問題に察凊するこずができたはずです。

しかし、䜜者は、シヌケンスが互いに簡単に導出できるこずを知りたせんでした。 これは、PCGテクニカルレポヌトhttps://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdfのセクション4.2.3のこのステヌトメントから簡単に確認できたす。

「_c_を遞択するたびに、別のシヌケンスず共通の連続する出力のペアがない、異なる番号のシヌケンスが生成されたす。」

これは、シヌケンスが異なるこず、぀たり、基になるLCGが耇数のストリヌムを提䟛するこずの蚌拠ず芋なされたす。 このトピックに関するダヌストの1989幎の吊定的な結果は、論文のどこにも珟れおいたせん。 前に述べたように、これらの結果により、このようなシヌケンスはすべお同じであり、加法定数を法ずしお、堎合によっおは笊号が倉化したすPCGで発生するように、最倧​​効力の2の环乗係数を持぀LCGの堎合。

ダヌストの結果を匕甚しないのは「誠実な」間違いだず確信しおいたすが、問題は、䜿甚しおいる基になるLCGが、ある意味で「異なる」「ストリヌム」を提䟛しおいるず確信するず、そうでない堎合は最終的になるこずです。 PCGのようなゞェネレヌタヌを䜿甚するず、「ストリヌム」を倉曎した堎合でも、サブシヌケンスごずに2 ^ 72の重耇しない盞関サブシヌケンスが存圚したす。

ご意芋ありがずうございたした。 今のずころ、「PCGは良い/悪い」のような二元的な刀断には興味がありたせん。 そのような議論のためにあなた自身のフォヌラムを䜿甚しおください。 ここで話題になっおいるのは、numpyが䜕をするかであり、その最終的な刀断はnumpyの開発者にありたす。 皆さんがこの議論にもたらした専門知識に感謝したすが、最終的な刀断ではなく、根本的な事実に焊点を圓おたいず思いたす。 私は特に、私たちが持っおいるヘッドルヌムの量のアむデアを私に䞎える定量的なステヌトメントに感謝したす。 以前の刀断が間違っおいたのは、刀断に飛び぀くのが早すぎたからですので、たた避けおいただきたいず思いたす。 ありがずうございたした。

2぀のゞェネレヌタヌが2぀の盞関シヌドランダムに遞択から開始する確率を50以䞊取埗するには、ランダムに開始するゞェネレヌタヌが玄50䞇個必芁であるこずに泚意しおください誕生日のパラドックス。

@vignaこの蚈算に぀いお教えおいただけたすか 私が粟通しおいる誕生日の衝突蚈算では、 2**(n/2)アむテムでnビットの衝突が50発生する可胜性がありたす2の因数を䞎えるか取る。 50䞇ドルは2**19なので、危険な盞関関係は䞋䜍ビットの40ビット前埌の衝突から始たるず䞻匵しおいるようですが、これが実際に芳察できるずいう蚌拠は芋おいたせん。 テストをキャンセルする前に、䞋䜍40ビットを共有するペアをテストし、PractRandで16TiBに到達したした。 40ビットの衝突による障害を芳察した堎合、それを確認するためにいく぀のTiBをテストする必芁がありたしたか

増分を倉曎しおも、衝突の確率には圱響しないず確信しおいたす。 「PCGストリヌム」のメリットに぀いおのこれ以䞊の議論はトピックから倖れおいたす。 その議論を「䜜者」を繰り返し槌で打぀蚀い蚳ずしお䜿甚するこずは特に歓迎されおおらず、私たちの行動芏範を螏みにじっおいたす。 持続するずいうこずは、あなたの意芋なしに進めなければならないこずを意味したす。 ありがずうございたした。

@imnemeこれは、2の倧きな环乗の倍数でゞャンプするおいるようです。同じ増分でPCG64むンスタンスのペアを䜜成し、䞋䜍のnを共有するずビット、2぀の間で蚈算する距離は1 << n倍数です。 より匷力なDXSM出力関数も、この症状を解決しおいるように芋えたす。 むンクリメントを共有するPCG64DXSMむンスタンスのペアず、状態の䞋䜍64ビットを2TiBたで問題なくテストしたした。

OK、これは恥ずかしいこずです。それは50億ドルではなく、5億ドルでした。 1文字で倧きな違いが生たれたす。 すべりをお詫びしたす。

しかし、先に述べたように、これはたったく同じ開始状態に達する確率であり、盞関するサブシヌケンスの重なりが倧きくなる確率ではありたせん。 個人的には、盞関サブシヌケンスのないPRNGを䜿甚するこずを奜みたす。なぜなら、それらはたくさんあるからですが、あなたが正しく蚀うように、決定はあなただけです。

スクランブリング関数を修正しおミキシング特性を向䞊させるこずは、完党に合理的な解決策のように思えたす。

私の投皿は、PCGずSplitMixの構造の違いを明確にするこずを目的ずしおいたした。以前の投皿では、同様の問題があるず䞻匵しおいたため、それは正しい蚘述ではないず思いたす。 SplitMix甚にhttp://prng.di.unimi.it/corrpcgnumpy.cのようなプログラムを䜜成するこずはできたせん。

@rkern 、あなたは尋ねたした

@imnemeこれは、2の倧きな环乗の倍数でゞャンプするおいるようです。同じ増分でPCG64むンスタンスのペアを䜜成し、䞋䜍のnを共有するずビット、2぀の間で蚈算する距離は1 << n倍数です。 より匷力なDXSM出力関数も、この症状を解決しおいるように芋えたす。 むンクリメントを共有するPCG64DXSMむンスタンスのペアず、状態の䞋䜍64ビットを2TiBたで問題なくテストしたした。

昚幎のディスカッションスレッドを芋぀けおリンクしおいただきありがずうございたす。 はい、Sebastianoが圌の応答で述べおいるように、

スクランブリング関数を修正しおミキシング特性を向䞊させるこずは、完党に合理的な解決策のように思えたす。

XSL-RRは物事の匱点にありたす。 察照的に、PCGペヌパヌからの元のRXS-M出力機胜ず新しいDXSM出力機胜はどちらもスクランブルの方法でより倚くのこずを行うので、この皮の問題は瀺したせん。 DXSM昚幎のこのコミットでPCG゜ヌスに远加されたは、XSL-RRよりも匷力になるように特別に蚭蚈されたしたが、同様の時間パフォヌマンスを備えおいたすRXS-Mを参照、遅い。 昚幎、DXSMをかなりハヌドにテストしたしたが、実行の67日埌に長時間の停電が発生し、サヌバヌが停止しUPSのバッテリヌが消耗したした、テストの実行が終了したしたが、その時点で、通垞の䞡方でかなり良奜に蚌明されたした。テスト128 TBの出力がテストされたしたおよび2 ^ 48のゞャンプ64 TBの出力がテストされたした。実行速床が遅いため。

DXSMを蚭蚈しなくおも、RXS-Mが問題を凊理したずしたら、1぀の質問は、代わりに匱いXSL-RR順列を䜿甚した理由です。出力関数で垞に非垞に匷力なビットスクランブリングを䜿甚しないのはなぜですか。 答えは、基本的にはサむクルに垰着するずいうこずです。 スピヌドは人にずっお重芁なので、必芁以䞊にスクランブルをかけないようにしたす。

圌のアプロヌチず私のアプロヌチには倚くの共通点があるため、これはセバスティアヌノがよく知っおいる問題です。 私たちはそれぞれ、最新の統蚈的怜定私の堎合はLCG、圌の堎合はMarsagliaのXorShift LFSRに倱敗する、長い間確立されたアプロヌチを採甚し、スクランブル出力関数を远加しおそれを利甚したす。 私たちは䞡方ずもその出力関数を安䟡にするよう努めおいたすが、出力関数でマスクしようずしおいる基盀ずなるゞェネレヌタヌの欠陥が明らかになっおいるずころを少し芋぀けたした。 圌の堎合、それは線圢性の問題です。

しかし、私を倧いに喜ばせた最近の研究で、圌はたた、出力関数によっお十分にマスクされおいないハミング重みの問題私自身の長幎の懞念を反映しおいるを持っおいるLFSRベヌスの蚭蚈の数を瀺したした。 圌自身のゞェネレヌタヌは圌のテストに合栌しおいるので、それは䜕かですが、2018幎に圌の新しいxoshiro PRNGを芋おいたずき、䞋にあるゞェネレヌタヌからのハミング重みの問題が圌の出力関数を通過したように芋えたした。 それ以来、圌は新しい出力関数でxoshiroを改蚂したしたが、それでうたくいくこずを願っおいたす圌は他にもいく぀か倉曎を加えたので、このテストプログラムで匷調されおいる繰り返しの問題も修正されるのではないでしょうか。

圌の盞関プログラムに぀いおは、2018幎に圌がさたざたな問題䞍自然なシヌドなどで曞いたプログラムを含むPCGの批評を圌のりェブサむトに掲茉したずきに、私は同様のプログラムの束を含むたSplitMixで盞関ストリヌムを䜜成するcorrsplitmix2.cを含む、他の長く確立されたPRNGの堎合。 セバスチャンがそれができないず蚀ったずきに䜕を意味するのかはよくわかりたせんが、圌の新しいプログラムが圌のものず実質的に異なるかどうかを確認するために圌のテストプログラムを詳しく調べる機䌚がなかったこずを認めたす数幎前に曞いた。

私の理解䞍足を蚱しおください-しかし、この段階で誰かに芁玄の結論を求めるこずはできたすか デフォルトのPCGが安党でない珟実的な状況はありたすか デフォルトを切り替えるための匕数は䜕ですか

簡単な方法は、高超高次元のアプリケヌションず盞関シヌケンスの確率に関するドキュメントを远加するこずです。

より難しいパスは、ストリヌムを䞭断する出力関数を眮き換えるこずです。 default_rngがどれほど匷力な玄束をするのかわかりたせん。 ドキュメントはこれが倉曎される可胜性があるこずを譊告しおいないようであるため、倉曎するには非掚奚サむクルが必芁になる可胜性がありたす。 これには、新しい出力関数をスタンドアロンビットゞェネレヌタヌずしお远加したたはPCG64から構成可胜で、より賢明です、XXXX幎/リリヌスY.ZZ以降に倉曎されるこずをナヌザヌに譊告する必芁がありたす。

最も難しい方法は、新しいデフォルトのrngを芋぀けるこずです。 初めおのこずは簡単ではなく、過去18か月間、針を特定の方向に動かすために䜕も倉わっおいないず思いたす。

default_rng()倉曎に぀いおgh-16493を開きたしたが、この問題に関連しおいるずは思いたせん。話し合う必芁があるかどうかさえわかりたせん。おそらくずっず前にルヌルを蚭定しおいたので、私はしたせん。芚えおおいおください。


私はこの議論を完党に理解しおいるずは䞻匵しおいたせんが、理解すべきこずが2぀あるようです。

  1. 私たちには十分な前進があるず確信しおいるので、これに぀いおロバヌトを信頌する必芁がありたす。今のずころ、私たちの知る限りでは問題ないように思えたすか ぀たり、実際の衝突の確率は、NumPyが䜿甚される可胜性のあるものよりも倧きい環境でも、おそらく恥ずかしいほど䜎いのでしょうか将来デフォルトを倉曎する必芁があるかどうかは別の問題です。
  2. 私たちは次のように述べおいたす。

    [...]ずmath 2^{127}ストリヌムをサポヌトしたす

    数字がどこから来おいるのか正確にはわからないので、私たちの偎では少し誇匵されおいるように聞こえたすが、完党に正しいず少し調敎したず芋なすこずができたすか たたは、远加の詳现を提䟛する倖郚リ゜ヌスにリンクしたすか

今すぐ行う最も簡単な方法は、 PCG64DXSM BitGeneratorを远加するこずです。これは、「安䟡な乗数」ずより匷力なDXSM出力関数を備えたPCG64のバリアントです。 これは、珟圚PCG64実装にあるXSL-RR出力関数からのステップアップであり、ランタむムパフォヌマンスを損なうこずなく統蚈的に優れたパフォヌマンスを発揮するこずに誰もが同意しおいるず思いたす。 PCG64が私たちが提䟛するBitGeneratorのは、ニッチでの簡単なアップグレヌドです。 PCG64ず䞀緒に远加する必芁があるず思いたす。

ちなみに、 PCG64コンストラクタヌのオプションではなく、 BitGeneratorずいう名前の別のファむルにするこずをお勧めしたす。 このようなオプションは、さたざたなアルゎリズムやバリアントを提䟛するこずを目的ずしたrandomgenで優れおいたすが、 numpy堎合は、遞択を「グラブアンドゎヌ」にする必芁があるず思いたす。できる限り。

default_rng()提䟛するものに倉曎を加えるためのポリシヌを実際に解決したずは思いたせん。 私が提案したずき、その機胜をGenerator()コンストラクタヌに入れるよりも、それを奜んだ理由の1぀は、必芁に応じお非掚奚にしお別の名前の関数に移動できるずいう考えを持ち出したした。 ただし、圓時、 default_rng()は、基になるBitGenerator倚くの詳现を公開する必芁があるかもしれないず考えおいたしたが、その埌は回避したした。 PCG64DXSMはPCG64ず同じAPI特に.jumped() を公開するため、新しいデフォルトずしお䜿甚するずビットストリヌムが倉曎されるずいう唯䞀の考慮事項がありたす。 NEP 19のGeneratorメ゜ッドからのストリヌムに察する他の倉曎ず同じタむムラむンに埓うのが合理的だず思いたす぀たり、 X.Y.0機胜リリヌス。 必芁に応じお、もう少し慎重になるこずを遞択できたす。最初に、 PCG64DXSMを1.20.0ずドキュメントで利甚可胜なBitGeneratorずしお公開したすただし、 warn()は公開したせん。 、ノむズが倚すぎお効果がない default_rng()が1.21.0䜿甚するように倉曎されたす。

新しいBGを远加する䞀環ずしお、PCG64のメモを曎新しおガむドずしおの圹割を開始し、新しいバリアントを優先する理由を提䟛するずよいでしょう。

  1. 私たちには十分な前進があるず確信しおいるので、これに぀いおロバヌトを信頌する必芁がありたす。今のずころ、私たちの知る限りでは問題ないように思えたすか ぀たり、実際の衝突の確率は、NumPyが䜿甚される可胜性のあるものよりも倧きい環境でも、おそらく恥ずかしいほど䜎いのでしょうか将来デフォルトを倉曎する必芁があるかどうかは別の問題です。

それはおそらく少しグリブすぎたす。 これは、ストリヌムの数、各ストリヌムから取埗するデヌタの量、および誕生日の衝突に察するリスク蚱容床によっお異なりたす。 私はただその数孊をわかりやすい段萜にたずめお、わかりやすい掚奚事項を䜜成するこずに慣れおいたせん。そのため、このGithubの問題をしばらく再怜蚎しおいたせん。 ただし、_今_修正する必芁があるのはヘアオンファむアの問題ではないず思いたす。

埌で䜕かを曞きたすが、このスレッドでそれを芋るず、私たちは昚幎行った地面を読み盎しおいたす。 SebastianoがNumPyがPCGを出荷したこずを発芋した以倖は䜕も倉わっおいたせん。 昚幎のNumPyチヌムの分析はより詳现であり、より劥圓なシナリオを怜蚎したした。

私の奜みは、混乱を枛らすために、できるだけ早くデフォルトをアップグレヌドするこずです。 ぀たり、廃止サむクルを埅たないでください。

@ imneme-ありがずう

おそらくそれに぀いおの過去の投皿爆発はこれです。 確かに読む䟡倀があるず思いたす。 そこからスレッドを䞊にスクロヌルしお、これらの問題に぀いお話しおいるのを芋るこずができたす。 それはPCG32に぀いおでした。

私は蚀いたいこずを頭の䞭に持っおいたしたが、1幎前の投皿を芋るず、ここず他の堎所の䞡方ですでにすべおを蚀っおいたす私のブログ2017、 reddit 、私のブログ2018 、およびNumPyディスカッションなどで

ストリヌムずその自己盞䌌性 @rkernがストリヌム䟝存テスタヌを䜜成したに぀いお、私は昚幎次のように曞いおいたす。

前述の私のブログ投皿で述べたように、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シヌケンスで混合するこずです。

私はその埌で、より深みに入ったこのコメントずで、この1 。

重芁なポむントは、ほがすべおのPRNGの堎合、少しの時間ず゚ネルギヌで病理孊的シヌドを考案できるこずです。 PCGはやや珍しい立堎にあり、特に手䜜りの病状を持぀PCGのもっずもらしい芋た目の皮たきを楜しんでいる人がいたす぀たり、Sebastiano。 その䜜業の結果ずしお、私は振り返り、圌のPRNGず他の長幎のPRNGの䞡方に察しお同じこずを行いたした。

䞀般に、PRNG状態を「ちょっずランダム」に芋えるもので初期化する必芁がありたす。 たずえ人々が他の方法でやりたいずしおも、それはかなり普遍的seed_seq䜜成した理由。 「䞍自然なシヌドを実行しよう」ゲヌムをプレむしたい堎合は、100個のLFSRの初期化のコレクションを䜜成し、それらすべおをれロランドに到達するこずから1K離すのは難しくありたせん。 䞍自然な初期化はすべお十分に無害に芋えたすが、同時にハミング重みのこの奇劙な䜎䞋にぶ぀かりたす。

劥圓な゚ントロピヌで初期化されたPCGゞェネレヌタヌを䜿甚しおいる堎合は、問題ありたせん。 1、2、3のようなゞャンクで初期化する堎合、PRNGでは実際に

しかし、DXSMは確かに匷力です。 私はそれがより良いか、私はそれを成し遂げなかっただろうず思いたすが、実際にはナヌザヌが叀兞的なPCG64の実装で問題に遭遇するこずはないずいうこずを理解する䟡倀がありたす。

PCG64のストリヌムに察する批刀/防埡をLCG増分を介しお珟圚の議論から切り離したいず思いたす。 LCGの数孊のために特定の二重性が関係しおいたすが、それは最初にここで提起された䞭心的な問題ではありたせん。 たた、Sebastianoの元の批評、あなたの応答、たたは叀いメガスレッドに存圚しおいたよりも、考慮すべき詳现がここにありたす。 おそらく、数孊にもっず時間を費やした専門家にずっおは、その぀ながりはより明癜ですが、少なくずも実際の結果は今ではより明確になっおいたす。

重芁なポむントは、ほがすべおのPRNGの堎合、少しの時間ず゚ネルギヌで病理孊的シヌドを考案できるこずです。

確かに、しかし、私の目の前で決定を䞋すのは、バむナリのできない/できないずいうこずではありたせん。 有限のPRNGからあたりにも倚くの数倀を匕き出すず、最終的にPractRandがそれを怜蚎したす。 そのバむナリファクトは、そのPRNGアルゎリズムを無効にしたせん。 そのバむナリから離れおヘッドルヌムの抂念を確立するこずは、元のPCGペヌパヌに぀いお私が本圓に感謝したこずの1぀でした。 敵察的に生成された病状を考えるず、その病状が良奜な゚ントロピヌシヌドからランダムに発生する可胜性がある頻床を調べるこずができたす。 それを数倀化しお、ナヌザヌぞの実践的なアドバむスにしたいず思いたす。

䞋䜍58ビットず同じ増分を共有する2぀の状態ピンをその䞭に配眮したすを考えるず、これらの状態からPCG64 XSL-RRむンスタンスをむンタヌリヌブするず、玄32GiBでPractRandで実際に芳察可胜な障害が発生したす。 それを避けたいのは圓然だず思いたす。 それでは、それをベンチマヌクずしお、適切な゚ントロピヌシヌドで発生する頻床を芋おみたしょう。 幞いなこずに、この敵察的なスキヌムは確率論的分析に適しおいたすすべおがそれほど友奜的であるずは限りたせん。 nむンスタンスの堎合、任意の2が同じ䞋䜍58ビットを共有する確率はn**2 / 2**58 、二重カりントの堎合は2の因数を䞎えたす。 したがっお、5億のむンスタンスでは、むンタヌリヌブされた堎合にPractRandが倱敗するようなペアリングが1぀ある可胜性が高くなりたす。 5億はたくさんありたす 私の刀断では、これほど倚くのPCG64むンスタンスを䜜成しようずするnumpyプログラムはおそらく芋られないでしょう。 numpyは間違ったツヌルである可胜性がありたす。

たた、埌続の描画が他の初期状態の䞋䜍58ビットの衝突状態のいずれかず「亀差」する初期状態を回避するこずも合理的だず思いたす。 私はただその論理を考えようずしおいたすが、長さは二次的ではなく線圢的に確率に圱響を䞎えるず思いたす。 私が正しく、各むンスタンスから16 GiBを描画したい堎合 2**28描画、これはPractRandの倱敗を瀺した各ペアから描画した量です。玄2**15しか䜜業できたせん。亀差点を芳枬する可胜性が非垞に高くなる前のPCG64を䜿甚するず、実際のnumpyプログラムで問題が発生する可胜性は䜎いず思いたす。 ただし、䞀郚のアプリケヌションは近づき始める可胜性がありたすたずえば、倧芏暡な分散匷化孊習の実行。

そのむンクリメントピンを取り出しお察凊したしょう。 XSL-RR出力関数では、状態に加えお増分を゚ントロピヌシヌドしおも、この特定の分析は倉曎されないず蚀っおも過蚀ではありたせん。 ゚ントロピヌシヌドされた増分の任意のペアに察しお、実際に衝突する状態の数は同じであるようです。 これらの状態を意図的に構築するための具䜓的な手順は、同じ䞋䜍58ビットでバッシングするよりも耇雑に芋えたすが、衝突する状態の数は同じであるように芋えるため、確率の蚈算は同じたたです。 これは、䞀般的にPCGスキヌムに固有のものではありたせん。 DXSM出力関数は十分に匷力であるため、増分を倉曎するず単玔な+2 、基になるLCGの最悪の状態距離メトリックが0䞎える堎合にも抵抗するのに十分であるように芋えたす。

最埌に、私たち党員が完党に䞀臎しおいるように芋えるこずを繰り返したす。 PCG64DXSMは良い考えです。 他に䜕もないずしおも、その改善された統蚈的特性は、私が文曞化するこずを䜙儀なくされおいるず感じるメンタルモデルを単玔化したす。

同じストリヌムにゞェネレヌタヌがある堎合にのみ問題が発生するため、ストリヌムは䟝然ずしおある皋床関連性がありたす。

しかし、どのような状況䞋で、それらは同じ䞋䜍58ビットを持ち、同じストリヌム䞊にあるでしょうか これが発生するナヌスケヌスはありたすか

私が知っおいるやや珟実的なケヌスの1぀は、昚幎 jumpedに぀いお話したずきに話し合ったケヌスです。以前にリンクしたこの投皿で話したした。

同じストリヌムにゞェネレヌタヌがある堎合にのみ問題が発生するため、ストリヌムは䟝然ずしおある皋床関連性がありたす。

残念ながら、XSL-RRの堎合はそうではありたせん。 2぀のPCG64 XSL-RRむンスタンスに぀いお考えおみたしょう。 増分を任意に゚ントロピヌシヌドし、状態の1぀を゚ントロピヌシヌドしたす。 同じ䞋䜍58ビット状態の同じむンクリメントの倱敗ず同じ方法でPractRandに倱敗する他のPCG64むンスタンスの2**70䞍良状態を構築できたす。 同じむンクリメントの堎合よりも実行が耇雑になりたす。 異なる増分で最初の状態ずしお䞋䜍58ビットを共有する代わりに、最初のむンスタンスから0距離LCG距離枬定によるである状態の䞋䜍58ビットを共有し、増分を考慮したす。 私は構成的蚌明Pythonコヌドを持っおいたすが、今寝お明日掃陀しなければなりたせん。

@rkern 、良い点。 私は認めたす、私はそれがどのように運ばれるかを芋るためにそのシナリオをテストしおいたせん。

重芁なポむントは、ほがすべおのPRNGの堎合、少しの時間ず゚ネルギヌで病理孊的シヌドを考案できるこずです。 PCGはやや珍しい立堎にあり、特に手䜜りの病状を持぀PCGのもっずもらしい芋た目の皮たきを楜しんでいる人がいたす぀たり、Sebastiano。 その䜜業の結果ずしお、私は振り返り、圌のPRNGず他の長幎のPRNGの䞡方に察しお同じこずを行いたした。

すでに述べたように、これは誀りです。 PCG内で簡単に芋぀けるこずができるように、たずえばxoshiro256 ++からの盞関した重耇しないシヌケンスのペアの䟋を私は知りたせん。

状態党䜓をすばやく混合するPRNGには、この問題はありたせん。 ここに投皿した䟋のように、xoshiro256 ++から盞互に関連する2぀の重耇しないシヌケンスを生成するプログラムを提䟛できる堎合は、そうしおください。

圌の盞関プログラムに぀いおは、2018幎に圌がさたざたな問題䞍自然なシヌドなどで曞いたプログラムを含むPCGの批評を圌のりェブサむトに掲茉したずきに、私は同様のプログラムの束を含むたSplitMixで盞関ストリヌムを䜜成するcorrsplitmix2.cを含む、他の長く確立されたPRNGの堎合。 セバスチャンがそれができないず蚀ったずきに䜕を意味するのかはよくわかりたせんが、圌の新しいプログラムが圌のものず実質的に異なるかどうかを確認するために圌のテストプログラムを詳しく調べる機䌚がなかったこずを認めたす数幎前に曞いた。

䞊で匕甚したプログラムは_ストリヌムを遞択したす_。 明らかにそれを曞くのは簡単です。

しかし、それはPCGの問題ずは䜕の関係もありたせん。 私が提䟛したプログラムは、_user_にストリヌムを遞択させおから、盞関関係を瀺したす。

繰り返しになりたすが、 http/のように他のゞェネレヌタヌで盞関シヌケンスを芋぀けそうしたす。

ナヌザヌにストリヌムを任意に遞択させるず、はるかに匷力な盞関関係が瀺されたす。

すでに述べたように、これは誀りです。 PCG内で簡単に芋぀けるこずができるように、たずえばxoshiro256 ++からの盞関した重耇しないシヌケンスのペアの䟋を私は知りたせん。

ここでお互いを超えお話しおいるようです。 以前に䜜成したさたざたな盞関プログラムなどで瀺されおいるように、PRNGに察しお盞関のある、重耇しないシヌケンスを思い付くこずができるずは蚀いたせんでした。 Xoshiro **の

たた、状態党䜓を混合しないPRNGには、XorWow、数倀レシピのゞェネレヌタヌなど、長い歎史がありたす。Sebastianoの議論は芖点を衚しおいたすが、圌の議論は、MarsagliaがWeylを远加するこずによっおXorWowでXorShiftを_worse_にしたず蚀うでしょうシヌケンスは、同様のゞェネレヌタヌを倚数䜜成するためです。

ここでお互いを超えお話しおいるようです。 以前に䜜成したさたざたな盞関プログラムなどで瀺されおいるように、PRNGに察しお盞関のある、重耇しないシヌケンスを思い付くこずができるずは蚀いたせんでした。 Xoshiro **の

技術的なレベルで議論を続けるようにしおください。 「病理孊的」には数孊的な意味はありたせん。

自己盞関をチェックするための技術的に正しい方法は、2぀のシヌドを芋぀けお2぀の重なり合わないシヌケンスを生成するこずですテストの期間䞭は重なり合いたせん。十分に遠くたで行くず、重なり合うこずは避けられたせん、それらをむンタヌリヌブしおバッテリヌに枡したすテストの。

オヌバヌラップする2぀のシヌケンスを怜蚎する堎合、シヌケンスがオヌバヌラップした埌に同じ出力が2回発生するため、暗号化されたものであっおも、すべおのゞェネレヌタヌで盞関があり、適切なテストでそれが怜出されたす。

重耇するシヌケンスを䜿甚する「病理孊的シヌド」は、すべおのゞェネレヌタヌにずっお簡単な䜜業です「病理孊的」が意味するものは䜕でも。

繰り返しになりたすが、他のゞェネレヌタヌでPCGテストが瀺すようにシヌケンスがオヌバヌラップしおいないず同様の盞関関係を芋぀けたず䞻匵しおいるので、たずえばxoshiro256 ++たたはSFC64からの盞関関係のあるオヌバヌラップしないシヌケンスのペアを提䟛できたすか 

自己盞関をチェックするための技術的に正しい方法は、2぀のシヌドを芋぀けお2぀の重なり合わないシヌケンスを生成するこずですテストの期間䞭は重なり合いたせん。十分に遠くたで行くず、重なり合うこずは避けられたせん、それらをむンタヌリヌブしおバッテリヌに枡したすテストの。

この盞関関係の定矩に぀いおの文献を指摘しお、私もそれに぀いお「技術的に正しい」たたでいるこずを確認できたすか

セバスティアヌノ、あなたは私があなたの条件で蚭定された挑戊に答えるこずを望んでいたす。 あなたが指摘しおいるのは、自己盞䌌性があるLCGの固有の特性に関連しおいたす。 混沌ずしたPRNGやLFSRベヌスの問題では同じ問題は芋぀かりたせん。

しかし、他のPRNGに぀いおは、他の匱点がありたす。

LFSRには、れロランド、悪い状態、ハミング重みの問題、線圢性があり、xoshiroでの詊みで孊んだように、繰り返しの奇劙な問題のような他の奇劙なこずがありたす。

カオスPRNGには、短いサむクルただし、カりンタヌがあるものはそれを回避したす— WeylシヌケンスFTWずその固有のバむアスのリスクがありたす。

私が曞いたように、シヌケンスが重耇しおいる堎合、テストは_垞に_倱敗したす。 _垞に倱敗する_テストはテストではないこずを理解するために、文献は必芁ありたせん。

繰り返しになりたすが、他のゞェネレヌタヌでPCGテストが瀺すようにシヌケンスがオヌバヌラップしおいないず同様の盞関関係を芋぀けたず䞻匵しおいるので、たずえばxoshiro256 ++たたはSFC64からの盞関関係のあるオヌバヌラップしないシヌケンスのペアを提䟛できたすか 

あなたは本圓に質問を避けおいるようです。 あなたの䞻匵に続いお、もしあれば、そのような蚌拠を提䟛するこずはあなたにずっお非垞に簡単でしょう。

今すぐ行う最も簡単な方法は、 PCG64DXSM BitGeneratorを远加するこずです。これは、「安䟡な乗数」ずより匷力なDXSM出力関数を備えたPCG64のバリアントです。 これは、珟圚PCG64実装にあるXSL-RR出力関数からのステップアップであり、ランタむムパフォヌマンスを損なうこずなく統蚈的に優れたパフォヌマンスを発揮するこずに誰もが同意しおいるず思いたす。 PCG64が私たちが提䟛するBitGeneratorのは、ニッチでの簡単なアップグレヌドです。 PCG64ず䞀緒に远加する必芁があるず思いたす。

64ビットの「安䟡な乗数」には蚌明可胜な欠陥があるこずに泚意しおください。 これは長い間知られおいたす

W.HörmannずG.Derflinger、に適したポヌタブル乱数ゞェネレヌタヌ
棄华法、ACMTrans。 数孊。 ゜フトりェア。 191993、no。 4、489–495。

䞀般に、モゞュラスの平方根よりも小さい乗数には、スペクトルスコアf²に固有の制限がありたす。

この制限は、65ビットの乗算噚を䜿甚するこずで簡単に克服できたす。この乗算噚は、コンパむラが远加の「远加」操䜜で倉換するだけで、おそらくゞェネレヌタの速床を倉曎するこずさえありたせん。

Guy Steeleず私はこの問題に少し取り組み、さたざたなサむズの安䟡な乗数のスペクトルスコアの衚を公開したした https 

たずえば、論文の衚7から、f²スコア0.9919の0x1d605bbb58c8abbfdが埗られたす。 64ビット乗算噚は0.9306を超えるこずはできたせん論文の定理4.1。

ミックスずすべおの埌、f₂スコアの改善は統蚈的な芳点から完党に芋過ごされる可胜性がありたす。 しかし、远加操䜜を远加するだけで最も関連性の高いディメンションが倧幅に改善されるこずを考えるず、努力する䟡倀があるず思いたすたあ、私たちは考えたす、たたは私たちは論文を曞いおいなかったでしょう。

セバスティアヌノ、あなたは私があなたの条件で蚭定された挑戊に答えるこずを望んでいたす。 あなたが指摘しおいるのは、自己盞䌌性があるLCGの固有の特性に関連しおいたす。 混沌ずしたPRNGやLFSRベヌスの問題では同じ問題は芋぀かりたせん。

うわヌ、そこに着くのに少し時間がかかりたした

LFSRには、れロランド、悪い状態、ハミング重みの問題、線圢性があり、xoshiroでの詊みで孊んだように、繰り返しの奇劙な問題のような他の奇劙なこずがありたす。

私は完党に同意したす—それがあなたがそれらをスクランブルしなければならない理由です。 LFSRずF²線圢ゞェネレヌタヌは異なるものであるこずに泚意しおください。 関連しおいたすが、異なりたす。

「リピヌトに関する奇劙な問題」は、い぀ものように、私がコメントできない非技術的な甚語です。

カオスPRNGには、短いサむクルただし、カりンタヌがあるものはそれを回避したす— WeylシヌケンスFTWずその固有のバむアスのリスクがありたす。

[曎新括匧で囲たれたカりンタヌの芳察を芋逃したので、コメントを曎新しおいたす。]

はい、SFC64にはそのような問題はありたせんカりンタヌを䜿甚したすので、カテゎリヌ党䜓に䞀般化するこずはしたせん。 蚌明可胜な、最も短いサむクル長を持぀慎重に蚭蚈されたカオスゞェネレヌタがありたす。

「リピヌトに関する奇劙な問題」は、い぀ものように、私がコメントできない非技術的な甚語です。

適切な専門甚語を䜿甚しなかったためにコメントできないのは奇劙に思えたす。このプログラムを実行しおから、適切な専門甚語で問題を説明する最善の方法を教えおください。その埌、適切ず思われるコメントを提䟛しおください。 私はそれに぀いお圌ず連絡を取り合ったので、あなたずデビッド・ブラックマンが最初に明るみに出たずきにこの問題に぀いお話し合ったであろうず想像したでしょうが、あなたがそれに぀いおコメントするのを芋たこずがありたせん。

numpyないPRNGの議論はトピックから倖れおいたす。 その議論を続けるためにあなた自身のフォヌラムを䜿っおください。 ありがずうございたした。

@ rkern-それは基準ずしお少し厳しいようです。 他の実装で共有されおいないNumpyの実装に欠陥がある堎合は、それに぀いお議論するのが劥圓ず思われたす。

私が蚀及しおいる亀換は、この問題で私たちの目の前にある決定を䞋すのに圹立っおいないこずを確認できたす。 それが進むたで、集䞭力を保぀ために䌚話が必芁です。

より広い文脈を理解するこずは有益だず思いたす。 セバスティアヌノはPCGに぀いお少し気になっおいお、䜕幎もの間それに察しお手すりをしおきたした。 私も圌のPRNGを批刀したので、最近は私たちの䞡方を芋お目を転がしお「あなたはお互いに同じくらい悪い」ず蚀う人もいるかもしれたせんが、実際には圌が䞻匵した埌にのみそうしたした私は圌のこずに぀いお決しお話さないこずによっお䜕かを隠そうずしおいたした実際には、私には時間/傟斜がありたせんでした-実際、私はそれらが倧䞈倫だず思っおいたした。

圌の批評は圹に立ちたす。圌が私の仕事に぀いお考えるこずに人生の倚くを費やすこずを遞んだこずを嬉しく思いたすが、圌のテストは本質的に敵察的であるこずを認識するこずが重芁です。 圌は、PCGの構造に関する知識を䜿甚しお、RNGテスタヌに​​入力しおテストに倱敗する可胜性のある配眮を考案したす。

それがどれほど恐ろしいように芋えるかを考えるず、同様の敵察的アプロヌチが他の倚くのゞェネレヌタヌをトリップさせ、PCGに関しお圌が提起する懞念の倚くが他のゞェネレヌションスキヌムにも圓おはたるこずを瀺すのは合理的です。 XorWowのように、以䞋で行うように、䟋ずしおSplitMixをよく䜿甚したす。 私たちの誰も、SplitMixに䜕らかの圢で特に投資しおいるわけではないず思いたす。

たずえば、SplitMixに぀いおは非垞に恐ろしいこずがありたす。デフォルトのストリヌム定数では、35185番目ごずの出力を芋るず、PRNGテストスむヌトで倱敗するこずを瀺しおいたす。 ああ、いや これは、内郚的にはカりンタヌWeylシヌケンスを0x9e3779b97f4a7c15 黄金比φに基づくだけむンクリメントしおいるためですが、35185 * 0x9e3779b97f4a7c15 = 0x86a100000c480245 、 14ビットが蚭定され、䞭倮に䜕もない倧きな垯がありたす。 たたは、360998717番目の出力ごずに芋るず、 0x48620000800401の内郚状態ぞの远加ず同等になりたす。これは、8ビットしか远加されおおらず、出力関数が完党にマスクするのが難しいものです。 。

SplitMixに぀いお怖がり続けお、芋お蚀うこずができたす。1぀は加法定数0x9e3779b97f4a7c15 、もう1぀は0xdaa66d2c7ddf743f 、2぀のストリヌムがある堎合、これをにフィヌドするず欠陥が発生したす。 PRNGテストスむヌト!!! しかし、それは2番目のものが他のもののちょうど3倍になるように考案されおいるためです。

そしお最埌に、誰かが「䞡方のストリヌムを提䟛する぀もりです、それで䜕か怖いこずをしおください」ず蚀った堎合、それらがπ 0x243f6a8885a308d3 ず_e _ 0xb7e151628aed2a6b に基づいおいるずしたしょう。 、確かに、もう少し怖がらせお、Piストリヌムから6561221343番目のアむテムごずに取埗し、Eストリヌムからの6663276199番目のアむテムごずに混合しお、2぀の同䞀のものを生成したす。シヌケンス。 そしお_さらに悪い_、次に、ストリヌムaのすべおのゞャンプに぀いお、同じ出力を䞎えるためにストリヌムbに䞀臎するゞャンプがあるこずを瀺したす。したがっお、実際には2 ^ 64の方法で盞関したす!!! そしお、これは任意の2぀のストリヌムに察しお実行できたす。πず_e_に぀いお特別なこずは䜕もありたせんでした。

PCGに戻るず、Sebastianoのテストは、䞀臎する出力がむンタヌリヌブされるように正確に䜍眮合わせされた2぀のPCG64 XSHRRゞェネレヌタヌに䟝存しおいたす。 PRNGの1぀を少しだけ進めお、完党な䜍眮合わせを少しだけ壊すず、疑わしいものを怜出するのが非垞に難しくなりたす。

他の方向での同様の敵察的テストSebastianoに負担をかけるは、PCG64 XSH RRからの出力に、それらが盞関しおいるずいう圌の䞻匵を満たすものを提䟛するこずですが、それらがどのように調敎されおいるかを正確に䌝えおいたせんそれらはただ右の䞀般的な近所。 圌の仕事は、それらが盞関しおいるこずを瀺すための配眮を芋぀けるこずです。

党䜓ずしお、緊急の火灜を消火するこずは実際には問題ではないず思いたすが、䞀方で、DXSMバヌゞョンは、この皮の問題を正確に軜枛するために昚幎䜜成されたものずしお優れおいたす。あなたがそれに切り替えおくれるこずを嬉しく思いたす。

PS次のコヌドを䜿甚しお、お気に入りの実数から魔法のワむル加法定数を䜜成できたす。

WeylConst[r_,bits_] = BitOr[Floor[(r-Floor[r])*2^bits],1]

それは数孊です。Pythonバヌゞョンは挔習ずしお残しおおきたす。

これが、さたざたな増分の䞋䜍ビット衝突を構築する方法です。

PCG64XSL-RRず䞋䜍58ビットの衝突の結果

❯ ./pcg64_correlations.py -m 58 | stdbuf -oL ./RNG_test stdin64 -tf 2 -te 1 -tlmaxonly -multithreaded
s0 = 0b01110010100110011101000110010010101111111001100011001011001011111001001110101010011101111101001101011000011100001111111111100001
s1 = 0b10110001011001100111100010000110101110011010101010011011010100011001011111001100010001101001001011010010110101001011101111111100
dist = 0x2eb6ec432b0ea0f4fc00000000000000
[
    {
        "bit_generator": "PCG64",
        "state": {
            "state": 152330663589051481538402839025803132897,
            "inc": 228410650821285501905570422998802152525
        },
        "has_uint32": 0,
        "uinteger": 0
    },
    {
        "bit_generator": "PCG64",
        "state": {
            "state": 235805414096687854712168706130903874556,
            "inc": 70910205337619270663569052684874994465
        },
        "has_uint32": 0,
        "uinteger": 0
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin64, seed = 0x12d551b8
test set = expanded, folding = extra

rng=RNG_stdin64, seed=0x12d551b8
length= 128 megabytes (2^27 bytes), time= 2.8 seconds
  no anomalies in 891 test result(s)

rng=RNG_stdin64, seed=0x12d551b8
length= 256 megabytes (2^28 bytes), time= 9.4 seconds
  no anomalies in 938 test result(s)

rng=RNG_stdin64, seed=0x12d551b8
length= 512 megabytes (2^29 bytes), time= 18.1 seconds
  no anomalies in 985 test result(s)

rng=RNG_stdin64, seed=0x12d551b8
length= 1 gigabyte (2^30 bytes), time= 31.2 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low1/8]FPF-14+6/16:cross         R=  +4.9  p =  1.7e-4   unusual          
  [Low4/16]FPF-14+6/16:all          R=  +8.4  p =  2.3e-7   very suspicious  
  [Low4/16]FPF-14+6/16:all2         R=  +8.3  p =  8.1e-5   unusual          
  [Low8/32]FPF-14+6/32:all          R=  +6.3  p =  2.1e-5   mildly suspicious
  [Low8/32]FPF-14+6/16:all          R=  +5.7  p =  8.0e-5   unusual          
  ...and 1034 test result(s) without anomalies

rng=RNG_stdin64, seed=0x12d551b8
length= 2 gigabytes (2^31 bytes), time= 52.7 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low4/16]FPF-14+6/32:all          R=  +7.4  p =  2.0e-6   suspicious       
  [Low4/16]FPF-14+6/16:(0,14-0)     R=  +7.7  p =  9.4e-7   unusual          
  [Low4/16]FPF-14+6/16:all          R=  +8.0  p =  5.9e-7   suspicious       
  [Low4/16]FPF-14+6/16:all2         R= +12.2  p =  2.1e-6   mildly suspicious
  [Low4/16]FPF-14+6/4:(0,14-0)      R=  +7.9  p =  6.3e-7   mildly suspicious
  [Low4/16]FPF-14+6/4:all           R=  +5.8  p =  6.7e-5   unusual          
  [Low4/16]FPF-14+6/4:all2          R= +11.5  p =  3.1e-6   mildly suspicious
  [Low8/32]FPF-14+6/32:(0,14-0)     R=  +7.8  p =  8.4e-7   unusual          
  [Low8/32]FPF-14+6/32:all          R=  +7.3  p =  2.3e-6   suspicious       
  [Low8/32]FPF-14+6/32:all2         R= +14.3  p =  3.8e-7   suspicious       
  [Low8/32]FPF-14+6/16:(0,14-0)     R=  +7.7  p =  8.8e-7   unusual          
  [Low8/32]FPF-14+6/16:(1,14-0)     R=  +7.7  p =  9.3e-7   unusual          
  [Low8/32]FPF-14+6/16:all          R=  +6.9  p =  5.3e-6   mildly suspicious
  [Low8/32]FPF-14+6/16:all2         R= +18.3  p =  8.0e-9   very suspicious  
  ...and 1078 test result(s) without anomalies

rng=RNG_stdin64, seed=0x12d551b8
length= 4 gigabytes (2^32 bytes), time= 90.2 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low1/8]BCFN_FF(2+0):freq         R= +14.8  p~=   6e-18     FAIL !         
  [Low1/8]BCFN_FF(2+1):freq         R=  +7.4  p~=   1e-6    mildly suspicious
  [Low1/8]FPF-14+6/16:cross         R=  +8.4  p =  2.1e-7   very suspicious  
  [Low4/16]FPF-14+6/32:(0,14-0)     R=  +8.9  p =  8.1e-8   mildly suspicious
  [Low4/16]FPF-14+6/32:(1,14-0)     R=  +8.5  p =  1.9e-7   mildly suspicious
  [Low4/16]FPF-14+6/32:all          R=  +9.4  p =  2.4e-8   very suspicious  
  [Low4/16]FPF-14+6/32:all2         R= +23.9  p =  5.2e-11   VERY SUSPICIOUS 
  [Low4/16]FPF-14+6/16:(0,14-0)     R= +13.8  p =  2.2e-12   VERY SUSPICIOUS 
  [Low4/16]FPF-14+6/16:(1,14-0)     R= +10.0  p =  7.3e-9   suspicious       
  [Low4/16]FPF-14+6/16:all          R= +12.1  p =  8.0e-11   VERY SUSPICIOUS 
  [Low4/16]FPF-14+6/16:all2         R= +52.5  p =  1.3e-22    FAIL !!        
  [Low4/16]FPF-14+6/4:(0,14-0)      R= +12.2  p =  7.0e-11   VERY SUSPICIOUS 
  [Low4/16]FPF-14+6/4:all           R=  +7.1  p =  3.7e-6   mildly suspicious
  [Low4/16]FPF-14+6/4:all2          R= +29.8  p =  7.1e-14    FAIL           
  [Low4/16]FPF-14+6/4:cross         R=  +5.3  p =  7.8e-5   unusual          
  [Low4/32]FPF-14+6/32:(0,14-0)     R=  +7.6  p =  1.3e-6   unusual          
  [Low4/32]FPF-14+6/32:all          R=  +6.0  p =  4.4e-5   unusual          
  [Low4/32]FPF-14+6/32:all2         R=  +9.4  p =  2.9e-5   unusual          
  [Low4/32]FPF-14+6/16:(0,14-0)     R=  +7.3  p =  2.5e-6   unusual          
  [Low4/32]FPF-14+6/16:all          R=  +6.5  p =  1.4e-5   mildly suspicious
  [Low4/32]FPF-14+6/16:all2         R=  +8.2  p =  8.0e-5   unusual          
  [Low8/32]FPF-14+6/32:(0,14-0)     R= +17.2  p =  1.7e-15    FAIL           
  [Low8/32]FPF-14+6/32:(1,14-0)     R= +12.7  p =  2.3e-11   VERY SUSPICIOUS 
  [Low8/32]FPF-14+6/32:all          R= +15.3  p =  7.9e-14    FAIL           
  [Low8/32]FPF-14+6/32:all2         R= +86.1  p =  1.2e-35    FAIL !!!       
  [Low8/32]FPF-14+6/16:(0,14-0)     R= +16.8  p =  3.5e-15    FAIL           
  [Low8/32]FPF-14+6/16:(1,14-0)     R= +12.2  p =  6.6e-11   VERY SUSPICIOUS 
  [Low8/32]FPF-14+6/16:all          R= +13.1  p =  8.9e-12   VERY SUSPICIOUS 
  [Low8/32]FPF-14+6/16:all2         R= +82.1  p =  1.7e-34    FAIL !!!       
  [Low8/32]FPF-14+6/4:(0,14-0)      R= +12.8  p =  2.0e-11   VERY SUSPICIOUS 
  [Low8/32]FPF-14+6/4:(1,14-0)      R=  +9.4  p =  2.5e-8   suspicious       
  [Low8/32]FPF-14+6/4:all           R= +10.5  p =  2.2e-9    VERY SUSPICIOUS 
  [Low8/32]FPF-14+6/4:all2          R= +42.0  p =  5.8e-19    FAIL !         
  ...and 1118 test result(s) without anomalies

PCG64 DXSMず䞋䜍64ビットの衝突の結果問題をより早く匕き起こすためですが、䜕も衚瀺されたせん

❯ ./pcg64_correlations.py -m 64 --dxsm | stdbuf -oL ./RNG_test stdin64 -tf 2 -te 1 -tlmaxonly -multithreaded
s0 = 0b10001000010110111101010101010101111100100011011111011111011111001011110101111100101101101100110101110001101101111111010101111111
s1 = 0b11000101110100011001011000001110100001001111001001100101010000101100011001010111011001100000010010011100101110001110101000011100
dist = 0x3a26b19c91e6da1d0000000000000000
[
    {
        "bit_generator": "PCG64DXSM",
        "state": {
            "state": 181251833403477538233003277050491434367,
            "inc": 46073632738916603716779705377640239269
        },
        "has_uint32": 0,
        "uinteger": 0
    },
    {
        "bit_generator": "PCG64DXSM",
        "state": {
            "state": 262946148724842088422233355148768897564,
            "inc": 125105549038853892415237434774494719583
        },
        "has_uint32": 0,
        "uinteger": 0
    }
]
RNG_test using PractRand version 0.93
RNG = RNG_stdin64, seed = 0x85cea9
test set = expanded, folding = extra

rng=RNG_stdin64, seed=0x85cea9
length= 128 megabytes (2^27 bytes), time= 2.6 seconds
  no anomalies in 891 test result(s)

rng=RNG_stdin64, seed=0x85cea9
length= 256 megabytes (2^28 bytes), time= 9.4 seconds
  no anomalies in 938 test result(s)

rng=RNG_stdin64, seed=0x85cea9
length= 512 megabytes (2^29 bytes), time= 18.5 seconds
  no anomalies in 985 test result(s)

rng=RNG_stdin64, seed=0x85cea9
length= 1 gigabyte (2^30 bytes), time= 32.3 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low4/32]BCFN_FF(2+3,13-3,T)      R=  -8.3  p =1-9.5e-5   unusual          
  ...and 1035 test result(s) without anomalies

rng=RNG_stdin64, seed=0x85cea9
length= 2 gigabytes (2^31 bytes), time= 55.8 seconds
  no anomalies in 1092 test result(s)

rng=RNG_stdin64, seed=0x85cea9
length= 4 gigabytes (2^32 bytes), time= 93.1 seconds
  no anomalies in 1154 test result(s)

rng=RNG_stdin64, seed=0x85cea9
length= 8 gigabytes (2^33 bytes), time= 175 seconds
  no anomalies in 1222 test result(s)

rng=RNG_stdin64, seed=0x85cea9
length= 16 gigabytes (2^34 bytes), time= 326 seconds
  no anomalies in 1302 test result(s)

rng=RNG_stdin64, seed=0x85cea9
length= 32 gigabytes (2^35 bytes), time= 594 seconds
  no anomalies in 1359 test result(s)

rng=RNG_stdin64, seed=0x85cea9
length= 64 gigabytes (2^36 bytes), time= 1194 seconds
  no anomalies in 1434 test result(s)

rng=RNG_stdin64, seed=0x85cea9
length= 128 gigabytes (2^37 bytes), time= 2334 seconds
  no anomalies in 1506 test result(s)
...

@rkern 、コヌドを共有しおいただきありがずう

うん、最埌のreturn前にさたざたなNにbg0.advance(N)を挿入するこずで、非公匏にそれを行いたした。 䜕かが衚瀺されるこずを確認するために、䞋䜍64ビットの衝突を䜿甚したした。 16ような小さなシフトでも障害はあたり倉わりたせんが、 128ようなわずかなシフトでも障害は32GiBに延長されたす。

オプションのビットゞェネレヌタずしおPCG64DXSMを远加し、最終的にはデフォルトにする必芁があるようです。 実装がありたすか

より広い文脈を理解するこずは有益だず思いたす。 セバスティアヌノはPCGに぀いお少し気になっおいお、䜕幎もの間それに察しお手すりをしおきたした。 私も圌のPRNGを批刀したので、最近は私たちの䞡方を芋お目を転がしお「あなたはお互いに同じくらい悪い」ず蚀う人もいるかもしれたせんが、実際には圌が䞻匵した埌にのみそうしたした私は圌のこずに぀いお決しお話さないこずによっお䜕かを隠そうずしおいたした実際には、私には時間/傟斜がありたせんでした-実際、私はそれらが倧䞈倫だず思っおいたした。

これらの考慮事項は完党に䞍適切だず思いたす。

メリットも蚌拠もなく、他の人の䜜品SplitMixなどを攻撃するこずを䞻匵しおも、PCGの混乱やNumpyのゞェネレヌタヌが改善されるこずはありたせん。 代わりに、より優れた乗数、たたはより適切に蚭蚈されたスクランブラヌが圹立぀堎合がありたす。

ナヌザヌがストリヌムを遞択できるずきに、SplitMixで盞関関係を瀺すテストをただ埅っおいたす。 明確にするために、Numpyのゞェネレヌタヌに぀いお、私はフォヌムのステヌトメントを蚌明したした

∀c∀d∀x∃y盞関

ここで、c、dは増分「ストリヌム」であり、x、yは初期状態です。 実際、2 ^ 72幎ありたす。 ぀たり、c、d、およびxをどのように遞択しおも、2 ^ 72yの盞関関係が瀺されたす。

SplitMixに提䟛したずされる察応するコヌドは、

∃c∃d∃x∃y盞関

぀たり、敵察的にc、d、x、yを遞択するず、盞関関係を瀺すこずができたす。

2぀のステヌトメントの匷さの違いは非垞に驚異的です。 2぀のステヌトメントを混同しようずするのは正しくありたせん。

@vignaは、 @ mattipず@rkernから、行動芏範に぀いお2回譊告を受けおいたす。 「他の人の仕事をスラッシングする」や「2぀のステヌトメントを混同しようずするのは玔粋なFUD」などの蚀葉を䜿甚するこずはできたせん。 これを最埌の譊告ず考えおください。 あなたの口調を倉えおください、さもないず私たちはあなたを犁止したす。 技術的な議論はただ歓迎されおいたす、他のものはこの時点ではありたせん。

これらの匏をニュヌトラルな匏に眮き換えおメッセヌゞを倉曎したした。 私はただ、議論の別の参加者を個人的に攻撃するこず「セバスティアヌノはPCGに぀いお少し䜕かを持っおいお、䜕幎もの間それに察しお手すりをしおいる」は完党に䞍適切だず思いたす。 私はあなたのためではないこずに非垞に驚いおいたす。

3回目で最埌に、SplitMixに぀いおの議論は、どちらの方向でも、私を少しも助けおくれたせん。 なぜそれが必芁なコンテキストを提䟛するず思うのか、たたは他の人に察応せざるを埗ないず感じるのかは理解できたすが、ここでの決定に圹立぀情報を提䟛しおいないずいうのは真実です。 あなたは䞡方ずもあなた自身のりェブサむトを持っおいたす。 それらを䜿甚しおください。

これらの匏をニュヌトラルな匏に眮き換えおメッセヌゞを倉曎したした。

ありがずうございたした。

私はただ、議論の別の参加者を個人的に攻撃するこず「セバスティアヌノはPCGに぀いお少し䜕かを持っおいお、䜕幎もの間それに察しお手すりをしおいる」は完党に䞍適切だず思いたす。 私はあなたのためではないこずに非垞に驚いおいたす。

確かにそれも芋たくないです。 しかし、そのメッセヌゞのトヌンはそれほど悪くはありたせん。

@vignaず@imnemeの建蚭的な事実に固執しおいただければ幞いです。

OK。 れロから始めたしょう。利䟿性ず速床のために、2の环乗係数を持぀LCGに基づくある皮のストリヌムを備えたゞェネレヌタヌが必芁です。 文献は、LCGの加法定数に基づいおストリヌムを䜜成するず、問題が発生する可胜性があるこずを瀺唆しおいたすが珟圚のように、それが必芁であるず仮定したしょう。

128ビットの状態ず適切な乗数少なくずも65ビットを備えたLCGを取埗し、さたざたなアプリケヌションハッシュ、PRNGなどで培底的にテストされたSplitMixのmix関数を䜿甚しお䞊䜍ビットを混乱させおみたせんか優れた結果をもたらしたすか

速床の違いはごくわずかだず確信しおいたす。 そしお、結果がすべおのビットに䟝存するずいう統蚈的な保蚌がありたす。これがここでの問題です。

これは、自己盞関の問題があるゞェネレヌタヌでミキシング関数を手䜜りするずいうよりも、「巚人の肩の䞊に立぀」アプロヌチのように思えたす。

@imneme私が䜿甚できるのは、DXSMに関するブログ投皿で、叀いメガむシュヌのこの発衚コメントよりもリンクが簡単です。 そのコメントの内容よりもはるかに倚い必芁はありたせんが、ここで蚀及したテストの珟圚のステヌタスを含めるずよいでしょう。 その開発に぀ながったメガむシュヌからの議論のいく぀かを芁玄したいのであれば、それは確かに有甚ですが、完党に必芁ずいうわけではありたせん。

@vigna

128ビットの状態ず適切な乗数少なくずも65ビットを備えたLCGを取埗し、さたざたなアプリケヌションハッシュ、PRNGなどで培底的にテストされたSplitMixのmix関数を䜿甚しお䞊䜍ビットを混乱させおみたせんか優れた結果をもたらしたすか

これが卑劣に聞こえる堎合はお詫びしたすが確かに指摘されたすが、それは誠実でもありたす。実装、分析、ベンチマヌク、およびPractRandの結果がWebサむトたたはarXivで衚瀺されるこずを楜しみにしおいたす。 私たちはここでは合理的な情報に基づいた実践者であり、PRNG研究者ではなく、この提案を実行するための十分な蚭備が敎っおいたせん。 その意味はわかりたすが、個人的な時間に他の制玄があるこずを考えるず、提案から実装、分析に至るたで努力する傟向はありたせん。 この提案をnumpyに察凊する堎合は、PRNG研究者がその䜜業を行う必芁がありたす。 あなたが本圓に他の誰かにこの提案に取り組んでいるなら、あなたのりェブサむトを䜿っおください。

NumPyのランダムなGenerator -> BitGenerator -> SeedSequenceアヌキテクチャは、プラグむン可胜であるこずが意図されおいたす。 議論の䞭で、BitGeneratorのPRを開くために誰かが必芁になるずころたで来おいるず思いたす。そうすれば、その実甚的な属性を珟圚NumPyにあるものず比范できたす。 プロゞェクトの䞀郚になるず、匕き続きテストを行うこずができ、デフォルトにするこずを決定する堎合がありたす。 その決定は、私が望むに、

  • バむアスの欠劂および他の基準私は専門家に譲りたす
  • パフォヌマンス
  • BitGenerator.spawnずSeedSequenceを䜿甚しお、私たちが掚進する芏範的なむンタヌフェヌスを介したさたざたなタむプのストリヌム衝突の確率。

個人的には、 spawnむンタヌフェむスを䜿甚するコヌドを介しおBitGeneratorsのメリットに぀いお議論するこずを避けたずき、この議論は私を倱いたした。 ベストプラクティスずしお宣䌝するのには理由があり、今埌のPRの議論がNumPyナヌザヌのベストプラクティスたす。

おそらく、ここでの結論の1぀は、 jumpedたたはadvanceを䜿甚するずグッドプラクティスに反する可胜性があるため、メ゜ッドずしおspawnのみを蚱可する必芁があるずいうこずかもしれたせん。 これに焊点を圓おた新しい問題たたはNEPも生産的である可胜性がありたす。

泚意@vignaが私たちに圱響するこずを䞋䜍ビットの誕生日の衝突を@mattip SeedSequence.spawn()同様のむンタヌフェむスを。 私が行った議論のどの郚分も、APIの適切な䜿甚に関連しおいるのでご安心ください。

@rkernが掚奚する完党に独立したゞェネレヌタヌのアプロヌチを䜿甚するには、いく぀かの#ifdefブロックを䜿甚しおpcg64.cに玄8行を远加するだけで枈みたす。 pyx / pxdは、それ以倖の点では、正しい定矩PCG_DXSM = 1ず曎新されたdocstringでのみ構築されおいるPCG64クラスず同じです。

特に、それを必芁ずするプラットフォヌム甚に゚ミュレヌトされた128ビットの数孊に぀いおは、おそらくもっず明確にしたいず思いたす。

https://github.com/rkern/numpy/compare/v1.17.4...rkern%3Awip/pcg64-dxsm

「安䟡な」64ビット乗算噚を䜿甚しおいるので、それよりも簡単に思えたした。 新しい出力ミキサヌ䞍倉を远加しおから、LCGの出力を取埗しおミキサヌを適甚するランダムゞェネレヌタヌの最終行の呚りにifdefを远加するだけです。

https://github.com/bashtage/randomgen/commit/63e50a63f386b5fd725025f2199ff89454321f4c#diff -879bd64ee1e2b88fec97b5315cf77be1R115

この時点でMurmurHash 3を远加するこずもできたすが、その傟向が匷かったのです。

ifステヌトメントはコンパむルされたすか ホットルヌプ内にそれらの倍数が必芁だずは思いたせん。

繰り返したすが、これはrandomgenずnumpy目的の違いに垰着したす。 パラメヌタ化されたファミリを䜜成するこずはrandomgen意味がありたすが、 numpyでは、アクティブなデフォルトからレガシヌBitGeneratorの実装を絡たせるこずは良い考えではないず思いたすBitGenerator 。 どちらか䞀方のパフォヌマンスのためにメンテナンスやリファクタリングを行う必芁がある堎合、その努力は改善されるのではなく悪化するだけです。

ここでロバヌトに同意したす。 1.19.0リリヌスに新しいビットゞェネレヌタを配眮するこずに䜕の䞍安もありたせん。珟圚の動䜜は倉曎されたせん。

@bashtageはたた、なおpcg_cm_random_r()䜿甚しお出力にプリ反埩状態ではなく、埌の反埩状態ず同じコヌドパスを維持するために、簡単なようであるこずを行っおいないので、 #ifdefたたはifスむッチ。

ifステヌトメントはコンパむルされたすか ホットルヌプ内にそれらの倍数が必芁だずは思いたせん。

いいえ、NumPyではif elseは次のようになりたす

#if defined(PCG_DXSM)
    pcg_output_dxsm(state.high, state.low)
#else 
   <old way>
#endif

これらは、uint128を手動で高䜎にシフトする凊理を凊理するために、uint128バヌゞョンずフォヌルバックバヌゞョンで別々に定矩する必芁がありたす。

@bashtageはたた、なお、 pcg_cm_random_r()䜿甚しお出力にプリ反埩状態ではなく、埌の反埩状態ず同じコヌドパスを維持するために、簡単なようであるこずを行っおいないので、 #ifdefたたはifスむッチ。

うヌん、 @ imnemeリファレンス実装に察しおテストし、2぀の異なるシヌドを䜿甚しお1000個の倀で100䞀臎したした。

https://github.com/bashtage/randomgen/blob/master/randomgen/src/pcg64/pcg_dxsm-test-data-gen.cpp

AFAICTそしお私は間違っおいるかもしれたせん

https://github.com/imneme/pcg-cpp/blob/master/include/pcg_random.hpp#L174

そしお

https://github.com/imneme/pcg-cpp/blob/master/include/pcg_random.hpp#L1045

uint_128パスが垞に安䟡な乗数を䜿甚しおいるこずを意味したす。

あなたがそこで䜕を蚀おうずしおいるのかわかりたせん。

正芏のPCG64DXSMが䜕であるかは䞍明です。 いずれの堎合も、出力関数は64ビット挔算のみを䜿甚したす。 お䜿いのバヌゞョンでは、別の堎所で64ビット乗算噚を䜿甚しおさらに高速化し、ポストではなくプレを返したす。 setseq_dxsm_128_64は、既存のPCG64の自然な拡匵のようで、出力関数のみを倉曎したす。

ああなるほど。 いいえ、Cで実装したものずは異なるC ++ゞェネレヌタヌを䜿甚したした。 setseq_dxsm_128_64ではなく、LCG反埩で「安䟡な乗数」を䜿甚するcm_setseq_dxsm_128_64ず同等のものを実装したした。 LCG反埩で倧きな乗数を䜿甚したす。 「安䟡な乗数」はDXSM出力関数内で再利甚されたすが、これは盎亀蚭蚈軞です。

なぜsetseq_dxsm_128_64を奜たないのですか

@imnemeは、最終的にC ++バヌゞョンの公匏pcg64を、 setseq_dxsm_128_64ではなくcm_setseq_dxsm_128_64を指すように倉曎する

事前反埩状態を出力するこずも、パフォヌマンスバンプの䞀郚です。

いく぀かのタむミングは次のずおりです。

In [4]: %timeit p.random_raw(1000000)
3.24 ms ± 4.61 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [5]: p = rg.PCG64(mode="sequence",use_dxsm=False)

In [6]: %timeit p.random_raw(1000000)
3.04 ms ± 8.47 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [7]: import numpy as np

In [8]: p = np.random.PCG64()

In [9]: %timeit p.random_raw(1000000)
3.03 ms ± 2.54 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

すべおUbuntu-20.04、デフォルトコンパむラ。

6遅くなりたす。 私には小さな違いのようです。 NumPy / randomgenのすべおのタむミングは、ネむティブコヌドの実際のタむトルヌプで取埗できるタむミングずはかなりかけ離れおいたす。

比范する

In [10]: x = rg.Xoroshiro128(mode="sequence")

In [11]: %timeit x.random_raw(1000000)
2.59 ms ± 35.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Cコヌドから公開されたものに150遅い??。

確かに、 numpyコンテキストでは、それはそれほど重芁ではありたせん。 これは、C ++のコンテキストではさらに重芁であり、テストぞのクラスタヌ月の割り圓おず、公匏C ++コヌドの将来のデフォルトpcg64ずしおの指名を掚進したした。 これらは、IMOのnumpyの最も近い動機です。

ブランチのストックPCG64ず私のPCG64DXSM違い「安い乗数」、DXSM出力関数、事前反埩状態の出力、個別のコヌドパス

[practrand]
|1> s = np.random.SeedSequence()

[practrand]
|2> pcg64 = np.random.PCG64(s)

[practrand]
|3> pcg64dxsm = np.random.PCG64DXSM(s)

[practrand]
|4> %timeit pcg64.random_raw(1000000)
100 loops, best of 3: 3.46 ms per loop

[practrand]
|5> %timeit pcg64dxsm.random_raw(1000000)
100 loops, best of 3: 2.9 ms per loop

MSVCの特殊な実装を䜿甚しおも、2぀の間の#ifdefsはほんのわずか私が持っおいたよりも倚いであるず私はただ蚀いたす。 さらに、RSN MSナヌザヌはclang13816👍を䜿甚できるようになりたす。

コヌドの重耇に぀いお議論しおいたすか #ifdefs難読化された数行のコヌドに぀いお心配するよりも、たずたりのない実装が必芁です:)

「PCG2.0」できればNumPyのGitHubの問題ではない堎所を定矩する完党に明確なステヌトメントの必芁性を匷調しおいたしたが、それはほずんど冗談でした。

ありがずう、 @ rkern etal。

@imneme私が䜿甚できるのは、DXSMに関するブログ投皿で、叀いメガむシュヌのこの発衚コメントよりもリンクが簡単です。 そのコメントの内容よりもはるかに倚い必芁はありたせんが、ここで蚀及したテストの珟圚のステヌタスを含めるずよいでしょう。 その開発に぀ながったメガむシュヌからの議論のいく぀かを芁玄したいのであれば、それは確かに有甚ですが、完党に必芁ずいうわけではありたせん。

時間枠を考えおいたすか 私はしばらくの間これを行う぀もりであり、他のこずによっおそれを抌し出しおもらうこずを意味しおいたので、実際に提案された期限を持぀こずは私にずっお有甚な動機になるでしょう。 たぶん䞀週間 二

@rkernは@vignaも匕甚したした。

128ビットの状態ず適切な乗数少なくずも65ビットを備えたLCGを取埗し、さたざたなアプリケヌションハッシュ、PRNGなどで培底的にテストされたSplitMixのmix関数を䜿甚しお䞊䜍ビットを混乱させおみたせんか優れた結果をもたらしたすか

FWIW、このアプロヌチは元のPCGペヌパヌで説明されおおり、非垞によく䌌た乗算xorshiftハッシュ関数である既補のハッシュ関数ずしお_FastHash_を䜿甚しおいたす。 私のテストでは、他の順列ほど高速ではありたせんでしたが、高品質でした。 Sebastianoは、2018幎のPCGの批評でもこのアむデアに぀いお蚀及しおおり、その批評に察する私の回答のこのセクションで説明したす。

圌のPCG批評の元のバヌゞョンでは、圌は圌自身のPCGバリアントを曞くこずで終わりたす。これを以䞋に匕甚したす。

        #include <stdint.h>

        __uint128_t x;

        uint64_t inline next(void) {
            // Put in z the top bits of state
            uint64_t z = x >> 64;
            // Update state
            x = x * ((__uint128_t)0x2360ed051fc65da4 << 64 ^ 0x4385df649fccf645)
                  + ((__uint128_t)0x5851f42d4c957f2d << 64 ^ 0x14057b7ef767814f);
            // Compute mix
            z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
            z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
            return z ^ (z >> 31);
        }

それ以来、圌は批評のコヌドを、より安䟡な乗数を䜿甚し、加法定数をわずか64ビットに削枛するさらに高速なバヌゞョンに曎新したした。

        #include <stdint.h>

        __uint128_t x;

        uint64_t inline next(void) {
            // Put in z the top bits of state
            uint64_t z = x >> 64;
            // Update state (multiplier from https://arxiv.org/abs/2001.05304)
            x = x * ((__uint128_t)1 << 64 ^ 0xd605bbb58c8abbfd) + 0x14057b7ef767814f;
            // Compute mix
            z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
            z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
            return z ^ (z >> 31);
        }

これら䞡方のバリアントに関する私の問題は、切り捚おられた状態䞊半分が䞊べ替え/スクランブルされおいるため、䞊べ替えが反転可胜であるずいうこずです。逆方向に実行しおスクランブルを解陀するず、すべおの固有の欠陥を含む単なる切り捚おられたLCGが残りたす。 私の奜みは、状態党䜓を䞊べ替え/スクランブルしおから、その切り捚おを出力するこずです。 もちろん、より少ないビットを䞊べ替え/スクランブルする方が高速です。通垞どおり、トレヌドオフがありたす。合理的な人々は、重芁なこずに぀いお意芋が分かれる可胜性がありたす。

しかし、圌自身のPCGバリアントを䜜成する圌の仕事は、私が昚幎それを曞いたずき、DXSM順列に非垞に有甚なむンスピレヌションを提䟛したした。

@charris PCG64DXSM実装を1.19.0で利甚できるようにするただし、ただデフォルトではないこずぞのあなたの欲求は䜕ですか そのタむムラむンは䜕ですか すでに1.19.0rc2がリリヌスされおいるようですが、これは新機胜を導入するのに最適ではありたせん。 繰り返しになりたすが、私はこの問題に぀いお熱狂的ではありたせん。 default_rng()ぞの倉曎に関するポリシヌを文曞化し、1.20.0で新しいものを導入するだけで、1.19.0をリリヌスするこずに傟倒したす。

@rkern最埌のrcは2週間以䞊公開する必芁があるため、6月埌半のリリヌスを怜蚎しおいたす。 テストが容易な堎合は、PCG64DXSMをオプションずしお遞択するこずに賛成です。実際には、新しいアクセサリのような新しい機胜ずは芋なしおいたせん。 たた、実際に機胜するコヌドを䜜成するために、物事を進めるのに圹立぀堎合もありたす。 NumPyはトレンドセッタヌです:)

線集もちろん、新しいコヌドに倧きな問題はなく、問題がないように芋えるず仮定したす。 たた、PCG64の問題に぀いおもあたり心配しおいたせん。掚奚される手順を䜿甚しお、問題が発生する可胜性はほずんどないようです。

@ imneme1週間は玠晎らしいでしょう。 2週間で十分でしょう。 ありがずう

私が自分自身に問いかけおいる質問がありたすが、それはやや話題から倖れおいたす。 ビットゞェネレヌタヌでランダムビットを生成する必芁がありたすが、AFAICTでは、ほずんどのテストには敎数が含たれたす。 実際にビットをテストする際に、既存のテストはどの皋床うたく機胜したすか その地域に詳しい人がその質問に答えおくれたら、私は最も感謝しおいたす。

テストされおいるのはビットストリヌムです。 テスト゜フトりェアに、出力するPRNGの自然なワヌドサむズを通知したすが、ビットの最適な折り畳みを実行しお、ビットの䞋䜍ビットたたは䞊䜍ビットで発生する傟向のある゚ラヌを最も効率的に匕き起こすこずができるようにするためです。悪いPRNGの単語。 最近私たち党員が䜿甚する傟向のある゜フトりェアはPractRandであり、そのテストはここに簡単に読むのにTestU01の論文です。 そのナヌザヌガむドには、テストの詳现が蚘茉されおいたす。

これが卑劣に聞こえる堎合はお詫びしたすが確かに指摘されたすが、それは誠実でもありたす。実装、分析、ベンチマヌク、およびPractRandの結果がWebサむトたたはarXivで衚瀺されるこずを楜しみにしおいたす。 私たちはここでは合理的な情報に基づいた実践者であり、PRNG研究者ではなく、この提案を実行するための十分な蚭備が敎っおいたせん。 その意味はわかりたすが、個人的な時間に他の制玄があるこずを考えるず、提案から実装、分析に至るたで努力する傟向はありたせん。 この提案をnumpyに察凊する堎合は、PRNG研究者がその䜜業を行う必芁がありたす。 あなたが本圓に他の誰かにこの提案に取り組んでいるなら、あなたのりェブサむトを䜿っおください。

私はあなたの芖点を完党に理解するこずができたす。 コヌドずベンチマヌクは、ペヌゞの䞋郚にあり、LCG128Mixずいう名前で数幎前からPCGhttp://prng.di.unimi.it/pcg.phpの問題に぀いおコメントしおいたす。 私のハヌドりェア、IntelRCoreTMi7-7700 CPU @ 3.60GHz、gcc9.2.1および-fno-move-loop-invariants-fno-unroll-loopsでは2.16nsかかりたす。

コヌドは非垞に単玔です。暙準のLCGず暙準のミキシング機胜Staffordの改良されたMurmurHash3のファむナラむザヌを組み合わせおいたす。 プログラム可胜な定数を持぀ように少し倉曎したした。

    #include <stdint.h>
    __uint128_t x; // state
    __uint64_t c;  // stream constant (odd)

    uint64_t inline next(void) {
        // Put in z the top bits of state
        uint64_t z = x >> 64;
        // Update LCG state
        x = x * ((__uint128_t)1 << 64 ^ 0xd605bbb58c8abbfd) + c;
        // Compute mix
        z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
        z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
        return z ^ (z >> 31);
    }

前に説明したように、モゞュラスの平方根よりも小さい乗数の理論䞊の問題があるため、65ビット定数は乗数ずしおの64ビット定数よりもはるかに優れおいたす。

より原理的な蚭蚈に興味がある堎合は、PractRandテストを実行したす。 ただし、このミキシング関数により、基盀ずなるゞェネレヌタヌがはるかに匱く単なる加算である、状態が小さい64ビット堎合でも、優れたゞェネレヌタヌであるSplitMixが生成されるこずを考慮する必芁がありたす。 したがっお、32TBでPractRandを通過するSplitMixよりも「優れおいる」だけです。

たた、基盀ずなるゞェネレヌタヌはLCGであるため、60幎代の通垞のベルやホむッスルゞャンプ、距離などがすべおありたす。ただし、結果のすべおのビットが、の䞊䜍64ビットのすべおのビットに䟝存するずいう統蚈的保蚌もありたす。状態。

他のゞェネレヌタヌに察するベンチマヌク、たたは他のコンパむラヌの䜿甚を念頭に眮いおいる堎合は、お知らせください。

ただし、同じように誠実にお願いしたす。暙準コンポヌネントのみを䜿甚した「巚人の肩の䞊に立぀」蚭蚈を怜蚎するこずに本圓に関心がある堎合に限りたす。 私の時間にも個人的な制玄があり、貢献できおうれしいですが、考慮される機䌚のない発電機に時間を費やすこずは避けたいず思いたす。

ずころで、関連する乗算噚の品質を改善する方法のより具䜓的な尺床を䞎えるために、PCGDXSおよびいく぀かの代替で䜿甚されおいる珟圚の64ビット乗算噚のf2からf1たでのスペクトルスコアを蚈算したした。

スペクトルスコアは、乗数の良さを刀断するための暙準的な方法です。 0は悪い、1は優れおいたす。 各スコアは、出力でペア、トリプル、4タプルなどがどの皋床適切に分散されおいるかを瀺したす。

TAoCPのKnuthが瀺唆しおいるように、これらの7぀の数倀は、叀兞的なメゞャヌ、最小、たたは加重メゞャヌ最初のスコアに加えお、2番目を2で割ったものなどで再開しお、最初のスコアをより重芁にするこずができたす。 、およびこれらは、珟圚の乗数の最小倀ず加重メゞャヌです。

0xda942042e4dd58b  0.633  0.778

それよりもはるかに優れた64ビット定数がありたす。

0xff37f1f758180525  0.761  0.875

基本的に同じ速床で少なくずもLCG128Mixの堎合は同じ速床で、65ビットに移行するず、より適切な加重メゞャヌが埗られたす。

0x1d605bbb58c8abbfd  0.761  0.899

その理由は、64ビット乗数にはf₂スコア≀0.93に固有の制限があるためです。これは、クヌヌスが最も関連性があるず指摘しおいたす。

0xda942042e4dd58b5  0.795
0xff37f1f758180525  0.928
0x1d605bbb58c8abbfd  0.992

したがっお、最初の乗数のスコアは平凡です。 2番目の乗算噚は、64ビット乗算噚の最適倀に非垞に近くなりたす。 65ビットの乗算噚にはこれらの制限がなく、スコアは1に非垞に近く、䞀般的に可胜な限り最高です。

完党を期すために、ここにすべおのスコアがありたす

 0xda942042e4dd58b5  0.794572 0.809219 0.911528 0.730396 0.678620 0.632688 0.639625
 0xff37f1f758180525  0.927764 0.913983 0.828210 0.864840 0.775314 0.761406 0.763689 
0x1d605bbb58c8abbfd  0.991889 0.907938 0.830964 0.837980 0.780378 0.797464 0.761493

これらのスコアを再蚈算するか、Guy Steeleず私が配垃したコヌドhttps://github.com/vigna/CPRNGを䜿甚しお、独自の乗数を探すこずができ

PCGはおそらくnumpyの優れたデフォルトのprngですが、これを行うためのより有望でテストされおいない方法があるため、時間の詊緎に耐えられるずは思いたせん。 以䞋のいずれかを提案したす。

半分混沌ずしたSFC64は、統蚈的に健党なゞェネレヌタヌの䞭で最も高速で、最小期間がかなり長いものの1぀です。 SFC64にはゞャンプ機胜はありたせんが、_速床のオヌバヌヘッドなしで、2 ^ 63の保蚌された䞀意のストリヌムをサポヌトするように拡匵できたす_。 カりンタヌを1぀むンクリメントするのではなく、ナヌザヌが遞択した加法定数k奇数である必芁がありたすを䜿甚しおWeylシヌケンスを远加するだけです。 各奇数kは、䞀意の党期間を生成したす。 Weylを䞀定に保぀には、远加の64ビットの状態が必芁です。

typedef struct {uint64_t a, b, c, w, k;} sfcw64_t; // k = stream

static inline uint64_t sfcw64_next(sfcw64_t* s) {
    enum {LROT = 24, RSHIFT = 11, LSHIFT = 3};
    const uint64_t out = s->a + s->b + (s->w += s->k);
    s->a = s->b ^ (s->b >> RSHIFT);
    s->b = s->c + (s->c << LSHIFT);
    s->c = ((s->c << LROT) | (s->c >> (64 - LROT))) + out;
    return out;
}

320ビットの状態は望たしくない堎合があるため、256ビットを再床䜿甚するように絞り蟌もうずしたした。 倉曎された出力関数にも泚意しおください。これは、ビットミキシングにWeylシヌケンスをより適切に利甚したす。 128/128ビットのカオス/構造化状態を䜿甚しおおり、バランスが取れおいるようです。
/線集出力関数からrotl64を削陀+クリヌンアップ、8月6日

typedef struct {uint64_t a, b, w, k;} tylo64_t;

static inline uint64_t tylo64_next(tylo64_t* s) {
    enum {LROT = 24, RSHIFT = 11, LSHIFT = 3};
    const uint64_t b = s->b, out = s->a ^ (s->w += s->k);
    s->a = (b + (b << LSHIFT)) ^ (b >> RSHIFT);
    s->b = ((b << LROT) | (b >> (64 - LROT))) + out;
    return out;
}

これは珟圚、異垞なしでPractRandテストで4 TBに合栌しおおり、これたで問題なくVignaのハミング重みテストを簡単に実行したしたただし、これらのテストに合栌しおも、ほが真のランダム出力が保蚌されるわけではなく、prngに欠陥があるかどうかのテストです。 。

泚ビットの玄50が蚭定された䞀意のランダムWeyl定数を䜿甚するこずは、統蚈的にはおそらく利点ですが、さらにテストたたは分析するだけで、これがどれほど重芁であるかが明らかになりたす。

/線集クリヌンアップ。

@ tylo-work SFC64はPhiloxずずもにすでにNumPyにあり、これはデフォルトのゞェネレヌタヌに関するものです。

さお、どれが実装されおいるのか正確にはわからなかったので、これはそれらの䞭から党䜓的に最も適したものを遞択するこずだけですか 十分に公平であり、明確にしおくれおありがずう。

提案したゞェネレヌタヌを広範囲にテストしお、他のゞェネレヌタヌずどのように連携するかを確認したす。これたでのずころ、速床、出力品質、シンプルさ/サむズ/移怍性、および倧芏暡な䞊列䜿甚に関しおは非垞に芋栄えがしたす。 しかし、他の人もそれをテストしおくれたら嬉しいです。

NumPyのバヌゞョンは、 k=1を持぀暙準のバリアントです。

https://github.com/numpy/numpy/blob/ad30b31af0bb3fbfdc0f11486807edc76cec2680/numpy/random/src/sfc64/sfc64.h#L25 -L33

デフォルトのPRNGに぀いおの議論を最初から再開する぀もりはないず思いたす。 珟圚のPRNGには非垞に具䜓的な問題があり、その特定の問題に察凊する、利甚可胜な密接に関連するバリアントを怜蚎しおいたす。 私たちの懞念の1぀は、珟圚のデフォルトのPRNGが、ゞャンプ可胜性などのPRNGの特定の機胜を公開しおいるこずです。これは、それを眮き換えるバリアントが匕き続き公開する必芁がありたす。 SFC64私たちたたはあなたのものにはその機胜がありたせん。

@bashtageは、 SFC64のWeyl-streamバリアントを远加するために

@ tylo-work䞊列実行に興味がある堎合は、NumPyのSeedSequence実装を確認するこずをお勧めしたす。

デフォルトのPRNGに぀いおの議論を最初から再開する぀もりはないず思いたす。 珟圚のPRNGには非垞に具䜓的な問題があり、その特定の問題に察凊する、利甚可胜な密接に関連するバリアントを怜蚎しおいたす。

PCG-DXSのようなものが必芁な堎合は、定数を改善するだけでさらに改善を行うこずができたすそしお非垞にわずかな速床䜎䞋。 たずえば、PCG-DXSは、同じ䞋䜍112ビットの状態を持぀2぀のむンタヌリヌブされ、盞関するサブシヌケンスで、2぀の異なるタむプのテストにすぐに倱敗したす。

rng=PCGDXS_int112, seed=0x4d198651
length= 128 gigabytes (2^37 bytes), time= 5700 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low1/64]TMFn(0+2):wl             R= +57.3  p~=   2e-27     FAIL !!
  [Low8/64]FPF-14+6/64:(1,14-0)     R= +17.5  p =  8.0e-16    FAIL
  [other failures in the same tests]
  ...and 1893 test result(s) without anomalies

箄65536の盞関シヌケンスに぀いお話しおいるこずに泚意しおください。恐れるこずはありたせん。

ただし、0x1d605bbb58c8abbfdなどのより優れた乗数ず、0x9e3779b97f4a7c15などのより優れたミキサヌを遞択するこずで、ゞェネレヌタヌを改善できたす。 最初の数倀は65ビットの乗算噚で、スペクトルスコアがはるかに優れおいたす。 2番目の数倀は、64ビットの固定小数点衚珟の黄金比であり、これには優れた混合特性があるこずが知られおいたす乗法ハッシュに関するKnuth TAoCPを参照。 たずえば、ハッシュコヌドを混合するためにEclipseコレクションラむブラリによっお䜿甚されたす。

その結果、同じ量のデヌタに察しおFPFだけで倱敗したす。

rng=PCG65-DXSϕ_int112, seed=0x4d198651
length= 128 gigabytes (2^37 bytes), time= 5014 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low8/64]FPF-14+6/64:(0,14-0)     R= +16.1  p =  1.5e-14    FAIL
  [other failures in the same test]
  ...and 1892 test result(s) without anomalies

実際、2TBでさらに進んだ堎合、PCG-DXSは、同じむンタヌリヌブされた盞関サブシヌケンスの3぀のタむプのテストに倱敗したす。

rng=PCGDXS_int112, seed=0x4d198651
length= 2 terabytes (2^41 bytes), time= 53962 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low1/32]TMFn(0+0):wl             R= +50.2  p~=   4e-23     FAIL !!
  [Low8/64]FPF-14+6/64:(1,14-0)     R=+291.1  p =  4.7e-269   FAIL !!!!!!
  [Low8/64]Gap-16:B                 R= +19.5  p =  1.4e-16    FAIL !
  [other failures in the same tests]
  ...and 2153 test result(s) without anomalies

䞀方、PCG65-DXSϕはFPFだけで倱敗したす。

rng=PCGDXS65ϕ_int112, seed=0x4d198651
length= 2 terabytes (2^41 bytes), time= 55280 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low8/64]FPF-14+6/64:(0,14-0)     R=+232.1  p =  2.0e-214   FAIL !!!!!!
  [other failures in the same test]
  ...and 2153 test result(s) without anomalies

もちろん、遅かれ早かれ、PCG65-DXSϕもギャップずTMFnに倱敗したす。 ただし、PCG-DXSよりもはるかに倚くの出力を確認する必芁がありたす。

これは、PCG65-DXSϕの完党なコヌドです。これは、より優れた定数を備えたPCG-DXSです。

#include <stdint.h>

__uint128_t x; // State
uint64_t c; // Additive constant

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

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

static uint64_t inline next(void) {
    __uint128_t old_x = x;
    x = x *  ((__uint128_t)1 << 64 ^ 0xd605bbb58c8abbfd) + c;
    return output(old_x);
}

わずかな速床䜎䞋は、远加呜什65ビット乗算噚によっお匕き起こされるず、ロヌドする2぀の64ビット定数があるためです。

私は䞀般的にこの皮のゞェネレヌタヌを掚奚しおいたせんが、PCG65-DXSϕは盞関を隠す点でPCG-DXSよりもかなり優れおいたす。

@Vigna 、s[0]=s[1]=s[2]=s[3] = k1 + stream*k2初期化されたす。 次に、12個の出力がスキップされたす。これは、基本的にsfc64が初期化される方法です。

これはxoshiroの掚奚される初期化ではないこずはわかっおいたすが、むンタヌリヌブストリヌムが少ないxoshiroのテストは問題ないように芋えたが、倚くの堎合倱敗したこずは興味深いこずであり、少し心配です。

seed: 1591888413
RNG_test using PractRand version 0.95
RNG = RNG_stdin64, seed = unknown
test set = core, folding = standard (64 bit)
...
rng=RNG_stdin64, seed=unknown
length= 2 gigabytes (2^31 bytes), time= 29.6 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low1/64]FPF-14+6/16:(1,14-1)     R=  +7.2  p =  3.7e-6   unusual
  [Low1/64]FPF-14+6/16:all          R=  +9.6  p =  1.8e-8   very suspicious
  ...and 261 test result(s) without anomalies

rng=RNG_stdin64, seed=unknown
length= 4 gigabytes (2^32 bytes), time= 55.5 seconds
  Test Name                         Raw       Processed     Evaluation
  [Low1/64]FPF-14+6/16:(0,14-0)     R= +13.4  p =  4.7e-12   VERY SUSPICIOUS
  [Low1/64]FPF-14+6/16:(1,14-0)     R=  +9.4  p =  2.6e-8   suspicious
  [Low1/64]FPF-14+6/16:(2,14-1)     R=  +7.7  p =  1.3e-6   unusual
  [Low1/64]FPF-14+6/16:all          R= +17.4  p =  8.8e-16    FAIL !
  ...and 275 test result(s) without anomalies

たた、SFC64ずTYLO64の初期化を匱めお、2぀の出力のみをスキップしようずしたしたが、それでも問題ないように芋えたした。
パフォヌマンスに぀いおxoshiro256 **は、私のマシンでは他の2぀より33遅く実行されたす。 TYLO64は、196ビットの状態倉数のみを曎新したす。 テストプログラムは次のずおりです。

int main()
{
    //FILE* f = freopen(NULL, "wb", stdout);  // Only necessary on Windows, but harmless.
    enum {THREADS = 256};
    uint64_t seed = 1591888413; // <- e.g. this fails. // (uint64_t) time(NULL); 
    fprintf(stderr, "seed: %lu\n", seed);

    static tylo64_t tyl[THREADS];
    static sfc64_t sfc[THREADS];
    static uint64_t xo[THREADS][4];

    for (size_t i = 0; i < THREADS; ++i) {
    tyl[i] = tylo64_seed(seed + (12839732 * i), 19287319823 * i);
    sfc[i] = sfc64_seed(seed + (12839732 * i));
    xo[i][0] = xo[i][1] = xo[i][2] = xo[i][3] = seed + (12839732 * i);
    for (int j=0; j<12; ++j) xoshiro256starstar_rand(xo[i]);
    }
    static uint64_t buffer[THREADS];
    size_t n = 1024 * 1024 * 256 / THREADS;

    while (1/*n--*/) {
        for (int i=0; i<THREADS; ++i) {
        //buffer[i] = tylo64_rand(&tyl[i]);
        //buffer[i] = sfc64_rand(&sfc[i]);
            buffer[i] = xoshiro256starstar_rand(xo[i]);
        }
        fwrite((void*) buffer, sizeof(buffer[0]), THREADS, stdout);
    }
    return 0;
}

関連するヘッダヌコヌドをいく぀か含めたす。

typedef struct {uint64_t a, b, w, k;} tylo64_t; // k = stream

static inline uint64_t tylo64_rand(tylo64_t* s) {
    enum {LROT = 24, RSHIFT = 11, LSHIFT = 3};
    const uint64_t b = s->b, w = s->w, out = (s->a + w) ^ (s->w += s->k);
    s->a = (b + (b << LSHIFT)) ^ (b >> RSHIFT);
    s->b = ((b << LROT) | (b >> (64 - LROT))) + out;
    return out;
}

/* stream in range [0, 2^63) */
static inline tylo64_t tylo64_seed(const uint64_t seed, const uint64_t stream) {
    tylo64_t state = {seed, seed, seed, (stream << 1) | 1};
    for (int i = 0; i < 12; ++i) tylo64_rand(&state);
    return state;
}

static inline uint64_t rotl(const uint64_t x, int k) {
    return (x << k) | (x >> (64 - k));
}
static inline uint64_t xoshiro256starstar_rand(uint64_t* s) {
    const uint64_t result = rotl(s[1] * 5, 7) * 9;
    const uint64_t t = s[1] << 17;
    s[2] ^= s[0];
    s[3] ^= s[1];
    s[1] ^= s[2];
    s[0] ^= s[3];
    s[2] ^= t;
    s[3] = rotl(s[3], 45);
    return result;
}

@ tylo-work分析に感謝したすが、集䞭し続けるにはこの問題が本圓に必芁です。 その䞀連の議論を継続したい堎合は、自分のGithubリポゞトリに䜜品を投皿し、ここにもう1぀投皿しお、ここにいる人々を招埅するこずをお勧めしたす。 他の皆さん、そこで返信しおください。 ご協力ありがずうございたす。

@imneme @ rkern1.19リリヌスの時間が䞍足しおいたす。

@rkern PCG64DXSMは1.19.0にならないようですが、今週末にリリヌスしたす。 䞊蚘の倉曎ポリシヌ/今埌の倉曎に぀いおのメモを曞いおいただければ幞いです。

申し蚳ありたせんが、私は他のいく぀かの無関係な問題を扱っおきたした。 私たちの議論に基づくず、PCG64DXSMは少なくずも今のずころ新しいデフォルトではなく、代替オプションずしお蚈画されおいたため、小さな遅延は倧きな問題ではないず思いたす。

1.20が起動しおいるので、これを再怜蚎しおDXSMに移行する時が来たしたか

分岐する前に移動する時間はただありたすが、来週かそこら以内に開始するのが良いかもしれたせん。 @bashtage PCG64DXSM準備ができおいるず思いたすが、これには䞻にデフォルトストリヌムのスむッチを切り替える決定が必芁ですか

芋たずころ、すぐに利甚できるのであれば、1.20でこれを実行する必芁があるように思えたした。

IIRC、リンクできるリファレンスを埅っおいたした。 しかし、乱数の人々が倉曎に満足しおいる堎合は、それを䜿甚する必芁がありたす。 Windows甚の特別なコヌドが必芁ですか

これは、異なる定数ず異なるスクランブリング関数です。 @rkernがWindowsでの元のPCG64実装のために曞いたものほど斬新なものはありたせん。 コヌドを共有するのではなく、完党にスタンドアロンのPCG64DXSMを䜿甚するこずにしたず思いたすパフォヌマンスのため。

rkernのWIPブランチから始めるのはおそらく理にかなっおいたす。

@rkernが望んでいたず思うブログ投皿を曞くず蚀ったのですが、他の問題にも@ rkernはさらに匷力な出力順列が奜きだったず思いたすが、

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