searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

从random随机数看验证码重复数字

2023-06-19 09:44:04
5
0
## 推导:
 
1. 有6个不同数字
- (0个重复数字: 1+1+1+1+1+1):
$$p(6) = C_{10}^6 * 6! \div 10^6$$

2. 有5个不同数字
- (某个数字重复了2次: 1+1+1+1+2):
$$p(5) = (\frac{C_{10}^5 * C_5^1}{2!*1!*1!*1!*1!} ) * 6! \div 10^6$$
$$     = (\frac{C_{10}^5 * C_5^1}{2!} ) * 6! \div 10^6$$

3. 有4个不同数字
- (某个数字重复了3次: 1+1+1+3,或某2个数字各重复2次: 1+1+2+2)。(省略$1!$):
$$p(4) = (\frac{C_{10}^4 * C_4^1}{3!} + \frac{C_{10}^4 * C_4^2}{2!*2!}) * 6! \div 10^6$$

4. 有3个不同数字
- (某个数字重复了4次: 1+1+4,或某个数字重复3次+某数字重复2次: 1+3+2, 或3个数字哥重复2次: 2+2+2):
$$p(3) = (\frac{C_{10}^3 * C_3^1}{4!} + \frac{C_{10}^3 * C_3^1 * C_2^1}{3!*2!}  +\frac{C_{10}^3 * C_3^3}{2!*2!*2!}) * 6! \div 10^6$$

5. 有2个不同数字
- (某个数字重复了5次: 1+5,或某个数字重复4次+某数字重复2次: 4+2, 或2个数字哥重复3次: 3+3): (省略$1!$):
$$p(2) = (\frac{C_{10}^2 * C_2^1}{5!} + \frac{C_{10}^2 * C_2^1}{4!*2!} + \frac{C_{10}^2 * C_2^2}{3!*3!}) * 6! \div 10^6$$

6. 有1个不同数字(6个相同的重复数字):
$$p(1) = \frac{C_{10}^1}{6!} * 6! \div 10^6$$
 
## 蒙特卡洛
 
```py 
import random

# 6位验证码, 相同数字的概率: 蒙特卡洛
def mtkr(count:int=10, is_show:bool=True, debug:bool = False):    
    ans = [0 for i in range(6)]
    for i in range(count):
        array_i = [random.randint(0, 9) for i in range(6)]              
        n = len(list(set(array_i)))
        if debug:
            print(n, ": ", array_i)
        ans[6-n] += 1
    # end_for
   
    if is_show:
        print('-' * 30)
        print('蒙特卡洛: count:', count, ";  \n模拟结果: ")
        for i in range(6):
            print("unique", 6-i, ": ", ans[i]/count)
    return [i/count for i in ans]

ans = mtkr(100000, is_show=True, debug=False)
print(ans)
res_plot(ans)
 
 
# 结果:
模拟结果:
# unique 6 : 0.15148
# unique 5 : 0.45396
# unique 4 : 0.32748
# unique 3 : 0.0643
# unique 2 : 0.00278 u
# nique 1 : 0.0
 
```
 
 
0条评论
0 / 1000
王****淋
5文章数
0粉丝数
王****淋
5 文章 | 0 粉丝
原创

从random随机数看验证码重复数字

2023-06-19 09:44:04
5
0
## 推导:
 
1. 有6个不同数字
- (0个重复数字: 1+1+1+1+1+1):
$$p(6) = C_{10}^6 * 6! \div 10^6$$

2. 有5个不同数字
- (某个数字重复了2次: 1+1+1+1+2):
$$p(5) = (\frac{C_{10}^5 * C_5^1}{2!*1!*1!*1!*1!} ) * 6! \div 10^6$$
$$     = (\frac{C_{10}^5 * C_5^1}{2!} ) * 6! \div 10^6$$

3. 有4个不同数字
- (某个数字重复了3次: 1+1+1+3,或某2个数字各重复2次: 1+1+2+2)。(省略$1!$):
$$p(4) = (\frac{C_{10}^4 * C_4^1}{3!} + \frac{C_{10}^4 * C_4^2}{2!*2!}) * 6! \div 10^6$$

4. 有3个不同数字
- (某个数字重复了4次: 1+1+4,或某个数字重复3次+某数字重复2次: 1+3+2, 或3个数字哥重复2次: 2+2+2):
$$p(3) = (\frac{C_{10}^3 * C_3^1}{4!} + \frac{C_{10}^3 * C_3^1 * C_2^1}{3!*2!}  +\frac{C_{10}^3 * C_3^3}{2!*2!*2!}) * 6! \div 10^6$$

5. 有2个不同数字
- (某个数字重复了5次: 1+5,或某个数字重复4次+某数字重复2次: 4+2, 或2个数字哥重复3次: 3+3): (省略$1!$):
$$p(2) = (\frac{C_{10}^2 * C_2^1}{5!} + \frac{C_{10}^2 * C_2^1}{4!*2!} + \frac{C_{10}^2 * C_2^2}{3!*3!}) * 6! \div 10^6$$

6. 有1个不同数字(6个相同的重复数字):
$$p(1) = \frac{C_{10}^1}{6!} * 6! \div 10^6$$
 
## 蒙特卡洛
 
```py 
import random

# 6位验证码, 相同数字的概率: 蒙特卡洛
def mtkr(count:int=10, is_show:bool=True, debug:bool = False):    
    ans = [0 for i in range(6)]
    for i in range(count):
        array_i = [random.randint(0, 9) for i in range(6)]              
        n = len(list(set(array_i)))
        if debug:
            print(n, ": ", array_i)
        ans[6-n] += 1
    # end_for
   
    if is_show:
        print('-' * 30)
        print('蒙特卡洛: count:', count, ";  \n模拟结果: ")
        for i in range(6):
            print("unique", 6-i, ": ", ans[i]/count)
    return [i/count for i in ans]

ans = mtkr(100000, is_show=True, debug=False)
print(ans)
res_plot(ans)
 
 
# 结果:
模拟结果:
# unique 6 : 0.15148
# unique 5 : 0.45396
# unique 4 : 0.32748
# unique 3 : 0.0643
# unique 2 : 0.00278 u
# nique 1 : 0.0
 
```
 
 
文章来自个人专栏
Kingforder
5 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0