是否有可能在区间[0,1]中生成均匀分布的BigFloat
类型的随机数?
我的意思是,由于rand(BigFloat)
不可用,我们似乎必须使用BigFloat(rand())
作为结尾。然而,这对我来说并不令人满意,因为我们正在生成随机Float64
数字,这些数字基本上被转换为BigFloats
"添加"一串零,但实质上它们是Float64
个随机数。它是否正确?如果是,是否有任何特殊的库来生成任意精度的随机数?
答案 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中解析它。