怎么得到随机数


#1

现在假设一个人会随机向上下左右四个方向走一步,向上的概率为0.123,向下的概率为0.234,向左的概率是0.345,向右的概率是0.298,该怎么生成随机数来控制这个人走路。

我现在能想到的是先建一个1000数组,然后令其中123个是“向上”,234个是“向下”…
然后随机从这个数组里去一个数来决定走的方向。

但是我感觉这个方法有点蠢,不知道有没有什么好的方法。


#2

=》取 1 个数,然后令其中 0.123 是“向上”,0.234 是“向下”…
=》把 1 按比例分段,区间长即为概率,每一个区间对应一个方向。取 [0, 1) 的随机数

function move()
    r = rand()
    if 0 <= r < 0.123
        :up
    elseif 0.123 <= r < 0.357 # 0.123+0.234
        :down
    elseif 0.357 <= r < 0.702 # 0.123+0.234+0.345
        :left
    else # if 0.702 <= r < 1.0 # 0.123+0.234+0.345+0.298
        :right
    end
end
move(nstep::Int) = [move() for _ in 1:nstep]

function test(n::Int)
    u = d = l = r = 0
    for _ in 1:n
        res = move()
        if res == :up
            u += 1
        elseif res == :down
            d += 1
        elseif res == :left
            l += 1
        else # :right
            r += 1
        end
    end

    println(
        """
        Total: $n steps
         direction  P(test)
            up:     $(u/n)
            down:   $(d/n)
            left:   $(l/n)
            right:  $(r/n)
        """
    )
end

效果

julia> move()
:right

julia> move(10)
10-element Array{Symbol,1}:
 :left
 :down
 :left
 :down
 :right
 :left
 :left
 :up
 :left
 :left

julia> test(10^9)
Total: 1000000000 steps
 direction  P(test)
    up:     0.122982397
    down:   0.234022127
    left:   0.345004072
    right:  0.297991404

#3

StatBase.jl 里有 Weightssample