现在假设一个人会随机向上下左右四个方向走一步,向上的概率为0.123,向下的概率为0.234,向左的概率是0.345,向右的概率是0.298,该怎么生成随机数来控制这个人走路。
我现在能想到的是先建一个1000数组,然后令其中123个是“向上”,234个是“向下”…
然后随机从这个数组里去一个数来决定走的方向。
但是我感觉这个方法有点蠢,不知道有没有什么好的方法。
现在假设一个人会随机向上下左右四个方向走一步,向上的概率为0.123,向下的概率为0.234,向左的概率是0.345,向右的概率是0.298,该怎么生成随机数来控制这个人走路。
我现在能想到的是先建一个1000数组,然后令其中123个是“向上”,234个是“向下”…
然后随机从这个数组里去一个数来决定走的方向。
但是我感觉这个方法有点蠢,不知道有没有什么好的方法。
=》取 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