是否有可能生成BigFloat在区间[0,1]中均匀分布的随机数类型?
我的意思是,因为rand(BigFloat)不可用,似乎我们必须BigFloat(rand())用于那个结局.然而,这对我来说并不令人满意,因为我们生成的随机Float64数BigFloats基本上通过"添加"一串零来转换,但实质上它们是Float64随机数.它是否正确?如果是,是否有任何特殊库可以生成任意精度的随机数?
对于未来的读者(使用Julia 0.7+),你可以这样做rand(BigFloat).从https://github.com/JuliaLang/julia/pull/22720开始
(您当然可以将该代码移植到0.6,并在MIT许可下使用它).
现在正在开发0.7-dev:
julia> rand(BigFloat)
5.381468355278042619008060591939155580805097923053455073547599255767645416051576e-01
julia> rand(BigFloat)
6.678413824545014328186230919629061895976571434256056298415613736582692882364622e-01
julia> rand(BigFloat)
1.388732949711447354224342960598222355426512649106497530016925083999303683268617e-01
Run Code Online (Sandbox Code Playgroud)
这个答案与@Dan Getz 的类似,但我更确信它是统一的(老实说,我没有做过 chi^2 测试来检查,也没有绘图或任何东西)。@Dan 可能是,我只是不确定。这个答案还考虑了 BigFloat 的精度水平,可以调整。(与直觉相反,也许某些BigFloats 的精度可能低于普通Float64s 等)
Base.rand(::Type{BigFloat}) = get(tryparse(BigFloat, "0." .* join(rand(['0','1'], precision(BigFloat))), 2))
Run Code Online (Sandbox Code Playgroud)
例子:
julia> rand(BigFloat)
5.775971375531676786209502831045802088939348666270278366043732289527176430673822e-02
julia> rand(BigFloat)
3.061194516436133765062723761241255852372302334681778915000436918803432772307184e-01
julia> rand(BigFloat)
1.39772524343615633719535808470123032232713877796596771875414945796651457395665e-01
Run Code Online (Sandbox Code Playgroud)
概念是 BigFloat 具有已知的精度,因此我们应该生成那么多随机位。当我们在 [0,1) 之间生成时,我们知道以 2 为基数的表示是0.某种东西。因此,我们以 2 为基数生成字符串,并以 2 为基数解析它。
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |