我想用正实数填充Julia中的数组。但我只找到了如何处理整数或实数(包括负数(的信息。有可能吗?谢谢
您可以使用任何数学公式将[0, 1)
范围映射到[0, +inf]
:
例如,如果x
是[0, 1)
范围内的随机变量(例如,对于浮点数据类型,使用rand()
获得(:
tan(x * pi / 2)
atanh(x)
log(x) ^ 2
-log(x) / x ^ p
(对于p
非负整数,它将改变数字分布(
还有许多其他功能。
当然,这些数字不再是均匀分布的,但这是不可能实现的。
从技术上讲,内置的randexp
满足了您的需求:指数分布有正实数作为其支持。不过,你实际得到的数字要低得多。对于半正态分布abs ∘ randn
也是如此。(在这两种情况下,您都可以将结果乘以一个大的正数,以增加与您的需求的差异。(
这里有一个有趣的替代方案:你可以生成均匀随机的位,并将它们重新解释为浮点(只需将符号始终设置为正(:
julia> bitrand(3*64).chunks
3-element Vector{UInt64}:
0xe7c7c52703987e68
0xc221b9864e7bab7e
0xa45b39faa65b446e
julia> reinterpret(Float64, bitrand(3*64).chunks)
3-element reinterpret(Float64, ::Vector{UInt64}):
2.8135484124856866e-108
-4.521596431965459e53
-5.836451011310255e78
julia> abs.(reinterpret(Float64, bitrand(3*64).chunks))
3-element Vector{Float64}:
1.6467305137006711e236
3.3503597018864875e-260
1.2211675821672628e77
julia> bitstring.(abs.(reinterpret(Float64, bitrand(3*64).chunks)))
3-element Vector{String}:
"0000110000011000001110000110001111010000011110111101000101101101"
"0011000010110101111100111011110100111100011011000101001100010011"
"0110111000001000101011010100011011010010100111111011001000001100"
不过,这仍然不是值的均匀分布,因为指数越大,浮点的精度就越小。