1.庄家和赔率
计算赔率
某促销活动拼团人数当时是1026人,上有两天结束,根据历史经验,假定1天参团人数为100人,则最终参团人数为1226人,考虑
[
1180
,
1230
]
[1180,1230]
[1180,1230]。计算该区间的素数和合数,以及公正赔率。代码如下:
# -*- coding: utf-8 -*-
import numpy as np
from time import time
import math
def is_prime(x):
return 0 not in [ x % i for i in range(2,int(math.sqrt(x))+1)]
def is_prime3(x):
p_list2 = []
flag = True
for p in range(2,int(math.sqrt(x))+1):
if x % p == 0:
flag = False
break
if flag:
p_list2.append(x)
return flag
if __name__ == "__main__":
a = 2
b = 10000
# 方法1:直接计算
# 返回当前时间的时间戳
t = time()
p = [p for p in range(a,b) if 0 not in [p % d for d in range(2,int(math.sqrt(p))+1)]]
print(p)
print(time()-t)
# 方法2:利用filter
t = time()
# 返回迭代器对象
iter = filter(is_prime,range(a,b))
print(iter)
list = [it for it in iter]
print(list)
print(time() - t)
# 方法3:利用filter和lambda
t = time()
is_prime2 = (lambda x: 0 not in [x % i for i in range(2,int(math.sqrt(x)+1))])
p = filter(is_prime2,range(a,b))
p_list = [i for i in p]
print(p_list)
print(time() - t)
print('--------------------------------')
a = 1180
b = 1230
p=filter(is_prime3,range(2,b+1))
p_list = [iter for iter in p]
print(p_list)
p_list2 = [i for i in p_list if i >= a]
print(p_list2)
print(len(p_list2))
print(b-a+1)
p_rate = float(len(p_list2))/float(b-a+1)
print('素数的概率:', p_rate, '\t')
print('公正赔率:', 1 / p_rate)
print('合数的概率:', 1 - p_rate, '\t')
print('公正赔率:', 1 / (1 - p_rate))
运行结果如下:
2.Nagel-Schreckenberg交通流模型
路面上有
N
N
N辆车,以不同的速度向前行驶,模拟堵车问题。有如下假设:
(1)假设某辆汽车当前速度为v;
(2)若前方可见范围内没车,则它在下一秒钟的车速提升到v+1,直到达到规定的最高速度;
(3)假设某辆汽车当前速度为v;
若前方有车,前车的距离为d,且d<v,则他的速度降低到d-1;
(4)每辆车会以概率p随机减为v-1。
代码如下:
#-- coding: utf-8 --
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
def clip(x,path):
for i in range(len(x)):
if x[i] >= path:
x[i] %= path
if __name__ == "__main__":
# 自定义样式
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
path = 5000 #环形公路长度
n = 100 #公路中的车辆数目
v0 = 50 #车辆初始速度
p = 0.3
Times = 3000
np.random.seed(0)
# numpy.random.rand()生成0到1之间的随机数
x = np.random.rand(n) * path
x.sort()
# umpy.tile()把数组沿各个方向复制,[50]*100
v = np.tile([v0],n).astype(np.float)
# figsize:指定figure的宽和高,单位为英寸
plt.figure(figsize=(10,8),facecolor='w')
for t in range(Times):
plt.scatter(x,[t]*n,s=1,c='k',alpha=0.05)
for i in range(n):
if x[(i+1)%n] > x[i]:
# 距离前车的距离
d = x[(i+1) % n] - x[i]
else:
d = path - x[i] + x[(i+1) % n]
if v[i] < d:
if np.random.rand() > p:
v[i] += 1
else:
v[i] -= 1
else:
v[i] = d - 1
# clip这个函数将将数组中的元素限制在a_min, a_max之间,大于a_max的就使得它等于 a_max,小于a_min
# 的就使得它等于a_min
v = v.clip(0,150)
x += v
clip(x,path)
plt.xlim(0,path)
plt.ylim(0,Times)
plt.xlabel(u'车辆位置',fontsize=16)
plt.ylabel(u'模拟时间',fontsize=16)
plt.title(u'环形公路车辆堵车模型',fontsize=20)
plt.tight_layout(pad=2)
plt.show()
运行结果如下: