- 由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
. - 随机打乱数组
从后往前,对位置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}
C5418C3618C31C5216C3618=5317