using Random
function pickone(dist)
n = length(dist)
i = 1
r = rand()
while r >= dist[i] && i<n
i+=1
end
return i
end
function init_items(type_dist, unique_elements)
return zeros(Int32, length(type_dist), maximum(unique_elements))
end
function draw(type_dist, unique_elements_dist)
item_type = pickone(type_dist)
item_number = pickone(unique_elements_dist[item_type])
return item_type, item_number
end
function draw_unique(type_dist, unique_elements_dist, items, x)
while sum(items .> 0) < x
item_type, item_number = draw(type_dist, unique_elements_dist)
items[item_type, item_number] += 1
end
return sum(items)
end
function average_for_unique(type_dist, unique_elements_dist, x, n, reset=true)
println("Started computing...")
items = init_items(type_dist, unique_elements)
tot_draws = 0
for i in 1:n
tot_draws += draw_unique(type_dist, unique_elements_dist, items, x)
if reset
items .= 0
else
items[items.>1] -= 1
end
end
return tot_draws / n
end
type_dist = [0.3, 0.3, 0.2, 0.15, 0.05]
type_dist = cumsum(type_dist)
unique_elements = [21, 27, 32, 14, 10]
unique_elements_dist = [[1 / unique_elements[j] for i in 1:unique_elements[j]] for j in 1:length(unique_elements)]
unique_elements_dist = [cumsum(dist) for dist in unique_elements_dist]
avg = average_for_unique(type_dist, unique_elements_dist, 10, 100000)
print(avg)
好的,这就是解决方案:
如果要将每个已完成的“预留”放在一边并继续处理剩余的内容,请按如下所示更改最后一行:
print(ue.average_for_unique(10, 100000, reset=False))
注:对于x=5,平均值为5.1;对于x=8,平均值为8.3。这并不奇怪,因为不同类型中有104个独特的元素
为了演示,这是使用Julia编程语言的同一个程序:
更长的启动时间,尤其是在下载和编译软件包时。在那之后,它燃烧得很快
有人可以改进Python版本以匹配Julia版本吗?100分赏金
相关问题 更多 >
编程相关推荐