Random 朱莉娅:兰德真的有可能投零分吗?

Random 朱莉娅:兰德真的有可能投零分吗?,random,julia,Random,Julia,sayrand在半开放单位间隔[0,1]中绘制iid均匀分布值,该间隔包括零,但rand是否曾经抛出零?是的,rand() 无论是否为零(rand()),软件都应设计为工作,并且 提供适当测试用例的良好实践。连续生成rand()的计算机多久产生一次零?使用非常粗略的估计:大约每六周一次 有时从(0.0,1.0)中取样可能更合适,忽略零 在允许的情况下。这里有一种方法 zero_as_one(x::T) where {T<:AbstractFloat} = ifelse(iszero

say
rand
在半开放单位间隔[0,1]中绘制iid均匀分布值,该间隔包括零,但rand是否曾经抛出零?

是的,
rand()

无论
是否为零(rand())
,软件都应设计为工作,并且 提供适当测试用例的良好实践。连续生成
rand()
的计算机多久产生一次零?使用非常粗略的估计:大约每六周一次

有时从(0.0,1.0)中取样可能更合适,忽略零 在允许的情况下。这里有一种方法

zero_as_one(x::T) where {T<:AbstractFloat} =
    ifelse(iszero(x), one(T), x)

rand1(::Type{T}) where {T<:AbstractFloat} =
    zero_as_one(rand(T))

function rand1(::Type{T}, n::I) where {T<:AbstractFloat, I<:Integer}
    n < 1 && throw(ArgumentError("n must be >= 1"))
    n === one(I) && return rand1(T)
    return map(zero_as_one, rand(T, n))
end
zero\u as\u one(x::T)其中{T
openrand() = openrand(Float64)

openrand(::Type{T}) where {T<:AbstractFloat} =
    let result = rand(T)
        while iszero(result)
            result = openrand(T)
        end
        result
    end

function openrand(::Type{T}, n::I) where {T<:AbstractFloat, I<:Integer}
    n < 1 && throw(ArgumentError("n must be >= 1"))
    n === one(I) && return openrand(T)
    result = Vector{T}(undef, n)
    for i in 1:n
        result[i] = openrand(T)
    end
    return result
end