require 'mathn'
# 排列数
def permutation(m, n)
return 0 if m < n
((m-n+1)..m).inject(:*)
end
# 第 n 号位的分数是 score 时,他比前 n - 1 个人都要优秀的概率
def highest(score, n)
permutation(score - 1, n - 1) / ( # 前 n - 1 个人分数都比 score 低的排列数除以
permutation(99, n - 1)) # 前 n - 1 个人所有的排列数
end
# n + 1 号学生比前 n 个学生都优秀,且 n + 1 号学生不是最优秀的学生的概率
def reject(n)
(1..99).inject(0) { |sum, score| sum + highest(score, n + 1) } / 100
end
expectations = {100=>0.01r, 99=>0.01r} # n = 99,100 时,概率为 0.01
98.downto(1) do |n|
expectations[n] = expectations[n + 1] * (1 - reject(n)) + 0.01r
end
expectations.reverse_each do |n, e|
puts "#{n} => #{e.to_f}"
end
require 'mathn'
# 排列数
def permutation(m, n)
return 0 if m < n
((m-n+1)..m).inject(:*)
end
# 第 n 号位的分数是 score 时,他比前 n - 1 个人都要优秀的概率
def highest(score, n)
permutation(score - 1, n - 1) / ( # 前 n - 1 个人分数都比 score 低的排列数除以
permutation(99, n - 1)) # 前 n - 1 个人所有的排列数
end
# n + 1 号学生比前 n 个学生都优秀,且 n + 1 号学生不是最优秀的学生的概率
def reject(n)
(1..99).inject(0) { |sum, score| sum + highest(score, n + 1) } / 100
end
expectations = {100=>0.01r, 99=>0.01r} # n = 99,100 时,概率为 0.01
98.downto(1) do |n|
expectations[n] = expectations[n + 1] * (1 - reject(n)) + 0.01r
end
expectations.reverse_each do |n, e|
puts "#{n} => #{e.to_f}"
end