# -*- coding: utf-8 -*-
#import sys
#sys.setrecursionlimit(1000000) #例如这里设置为一百万
from random import random
from math import floor
'''
这样一个场景:
n为一个正整数
m为一个正整数
在【0 , n)之间产生m次随机数, 求这些随机数在【0 , n)区间内覆盖率的预期,以及达到一定的覆盖率产生随机数次的预期
'''
#计算覆盖率,n为区间上限,m为产生随机数的次数
#逻辑没有问题,但是Python对于递归深度有限制,改成循环即可
def f_calcu(n , m) :
if m == 1 :
return 1.0/n
else :
tmp = f_calcu(n , m -1 )
return (1 - tmp)/n + tmp
#tmp = f_calcu(100 , 100)
#f_calcu(100 , 100) = 0.6339676587267709
#print tmp
#求覆盖率达到0.9999时,所需的次数预期
n = 100000
tmp = 1.0/n
cnt = 1
while True :
#print 1
cnt += 1
tmp = (1 - tmp)/n + tmp
if tmp > 0.9999 :
print cnt
break
#921030
#另一种方法
n = 100000
tmp = (n - 1.0)/n
cnt = 1
while True :
#print 1
cnt += 1
#每次随机数都是独立的,1- 始终未被覆盖到的
res = 1- tmp**cnt
if res > 0.9999 :
print cnt
break
#验证
tmp_set = set()
cnt = 0
while True :
cnt += 1
if len(tmp_set) > 99990 :
print cnt
break
tmp = int(random() * 10000000000000)%100000
tmp_set.add(tmp)
#import sys
#sys.setrecursionlimit(1000000) #例如这里设置为一百万
from random import random
from math import floor
'''
这样一个场景:
n为一个正整数
m为一个正整数
在【0 , n)之间产生m次随机数, 求这些随机数在【0 , n)区间内覆盖率的预期,以及达到一定的覆盖率产生随机数次的预期
'''
#计算覆盖率,n为区间上限,m为产生随机数的次数
#逻辑没有问题,但是Python对于递归深度有限制,改成循环即可
def f_calcu(n , m) :
if m == 1 :
return 1.0/n
else :
tmp = f_calcu(n , m -1 )
return (1 - tmp)/n + tmp
#tmp = f_calcu(100 , 100)
#f_calcu(100 , 100) = 0.6339676587267709
#print tmp
#求覆盖率达到0.9999时,所需的次数预期
n = 100000
tmp = 1.0/n
cnt = 1
while True :
#print 1
cnt += 1
tmp = (1 - tmp)/n + tmp
if tmp > 0.9999 :
print cnt
break
#921030
#另一种方法
n = 100000
tmp = (n - 1.0)/n
cnt = 1
while True :
#print 1
cnt += 1
#每次随机数都是独立的,1- 始终未被覆盖到的
res = 1- tmp**cnt
if res > 0.9999 :
print cnt
break
#验证
tmp_set = set()
cnt = 0
while True :
cnt += 1
if len(tmp_set) > 99990 :
print cnt
break
tmp = int(random() * 10000000000000)%100000
tmp_set.add(tmp)

该博客讨论了如何在0到n范围内产生随机数,计算覆盖率及其预期,并提供了达到特定覆盖率所需产生随机数的预期次数。通过递归和循环两种方法展示了计算过程,最后通过实际生成随机数进行验证。
1262

被折叠的 条评论
为什么被折叠?



