天天看点

随机数、概率题

  1. 由rand5 (0-4)生成rand7 (0-6)

    res = 5*rand5 + rand5

    ,这样生成0-24之间的数,能够保证每个数的概率相同,取0-20之间的数,舍弃后面的,然后输出res%7即为rand7的效果

    扩展:由randA (0-a)生成randB (0-b)

    若a>b,直接返回0-b之间的数即可;

    若a<b,

    res=(a+1)*randA+randA

    ,若res仍小于b,则令

    randA=res

    ,继续执行该步直到res>b返回0-b之间的数

    注意: 若rand是从1开始(如rand5 (1-a)),则上述生成新范围的概率公式为:

    a*(randA-1)+randA

    ,返回

    res%b + 1

    .
  2. 随机打乱数组

    从后往前,对位置i,选择0-i之间位置的值与i的值进行交换

import random
def shuffle(arr):
    for i in range(len(arr))[::-1]:
        x = random.randint(0, i)
        arr[x], arr[i] = arr[i], arr[x]
    return arr
           

每个数出现在任意位置的概率均为

1/n

3. 随机取样

总共取出m个

1)总数确定

设第i-1步已经取到T个,则第i个数取出的概率为

(m-T)/(N-i)

.

2)总数不确定,或者很大

对前m个数默认放在输出的数组中,对此后的第i个数以

m/i

保存在输出数组的任意位置.

4. 在一条高速公路上,在30分钟内看到一辆汽车的可能性是0.95,那么在10分钟内看到一辆车的概率是多少?(假设过车的概率是恒定的)

设10分钟内出现车的概率为p,则 ( 1 − p ) 3 = 1 − 0.95 (1-p)^3=1-0.95 (1−p)3=1−0.95,则可求出p

5. 一副扑克牌54张,平均分成三堆,大小王在一堆的概率?

C 3 1 C 52 16 C 36 18 C 54 18 C 36 18 = 17 53 \frac{\mathrm{C}_{3}^{1}\mathrm{C}_{52}^{16}\mathrm{C}_{36}^{18}}{\mathrm{C}_{54}^{18}\mathrm{C}_{36}^{18}}=\frac{17}{53} C5418​C3618​C31​C5216​C3618​​=5317​