随机BigFloats朱莉娅

时间:2017-12-04 07:17:03

标签: random julia

是否有可能在区间[0,1]中生成均匀分布的BigFloat类型的随机数?

我的意思是,由于rand(BigFloat)不可用,我们似乎必须使用BigFloat(rand())作为结尾。然而,这对我来说并不令人满意,因为我们正在生成随机Float64数字,这些数字基本上被转换为BigFloats"添加"一串零,但实质上它们是Float64个随机数。它是否正确?如果是,是否有任何特殊的库来生成任意精度的随机数?

3 个答案:

答案 0 :(得分:6)

对于未来的读者(使用Julia 0.7+),您可以使用julia> rand(BigFloat) 5.381468355278042619008060591939155580805097923053455073547599255767645416051576e-01 julia> rand(BigFloat) 6.678413824545014328186230919629061895976571434256056298415613736582692882364622e-01 julia> rand(BigFloat) 1.388732949711447354224342960598222355426512649106497530016925083999303683268617e-01 执行此操作。 截至https://github.com/JuliaLang/julia/pull/22720 (您当然可以将该代码移植到0.6,并在MIT许可下使用它。)

现在正在开发0.7-dev:

{{1}}

答案 1 :(得分:2)

这种方法是否合适:

randbigfloat(n) = 
  ( e = rand(0:n) ; 
    parse(BigFloat, join([rand('0':'9', e)...,'.',rand('0':'9', n-e)...])) )

使用方法:

julia> randbigfloat(10)
3.09424947699999999999999999999999999999999999999999999999999999999999999999999e+05

julia> randbigfloat(10)
7.146482599999999999999999999999999999999999999999999999999999999999999999999975

它可能不是最有效的方法。

答案 2 :(得分:2)

这个答案类似于@Dan Getz's 但我更确切地说它是统一的(说实话,我没有做过检查或绘图或任何东西的测试)。 @ Dan可能是,我只是不确定。 这个答案还考虑了可以调整的BigFloat的精度等级。 (与直觉相反,也许某些BigFloat的精度可能低于普通Float64等。

Base.rand(::Type{BigFloat}) =  get(tryparse(BigFloat, "0." .* join(rand(['0','1'], precision(BigFloat))), 2))

示例:

julia> rand(BigFloat)
5.775971375531676786209502831045802088939348666270278366043732289527176430673822e-02

julia> rand(BigFloat)
3.061194516436133765062723761241255852372302334681778915000436918803432772307184e-01

julia> rand(BigFloat)
     1.39772524343615633719535808470123032232713877796596771875414945796651457395665e-01

Notion是BigFloat具有已知的精度,因此我们应该生成那么多随机位。 当我们在[0,1]之间生成时,我们知道base-2表示是0.。 所以我们在base-2中生成字符串并在base 2中解析它。