python实现:链接如下:个人觉得抛硬币并不是真正的随机事件,和抛硬币时候的各种状态参量有关系,那么到底什么是真正的随机?
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
# 抛硬币次数
n_flip = 100
# 硬币弹跳次数
n_jump = 4
# 是否均匀初值
is_uniform = True
# 模拟硬币弹跳
def sim_coin_jump(x):
if is_uniform:
# 均匀初值使用sin(1000x+1)
return np.sin(1000 * x + 1)
else:
# 非均匀初值使用sin(1000πx+1)
return np.sin(1000 * np.pi * x + 1)
# 模拟抛硬币
def sim_flip_coin(x, n):
for i in range(n):
x = sim_coin_jump(x)
return x
# 初值均匀的随机过程:使用等差序列模拟
def uniform(f):
# 均匀间隔
iterable = (1 + (10 ** -10) * n for n in range(f))
return np.fromiter(iterable, float)
# 生成非均匀间隔序列
def uneven(f):
# 非均匀间隔: 随着n变化间隔会变小
iterable = (1 + (10 ** -10) * np.log(n + 1) for n in range(f))
return np.fromiter(iterable, float)
# 统计并画图
def stat_and_draw(R):
# 统计正负数个数
pos = np.where(R > 0)
npos = len(R[pos])
neg = np.where(R < 0)
nneg = len(R[neg])
# 计算相邻数的乘积期望
R1 = R[:-1]
R2 = R[1:]
mean = np.mean(np.multiply(R1, R2))
stat = "Statistics: pos[%d] neg[%d] mean[%s]" % (npos, nneg, mean)
plt.xlabel(stat)
# 标题
title = "Flip coin"
para = "(%s and coin_dump[%d])" % ('uniform' if is_uniform else 'uneven', n_jump)
title += para
plt.title(title)
print(title)
print(stat)
# X轴是抛硬币次数编号
X = np.arange(n_flip)
# plt.plot(X, R)
# 红圆圈标记点
plt.plot(X, R, marker='.', markeredgecolor='red', markerfacecolor='red')
plt.show()
def flap_coin():
# 生成初值序列
S = uniform(n_flip) if is_uniform else uneven(n_flip)
# 开始模拟抛硬币
R = sim_flip_coin(S, n_jump)
# 统计并画图
stat_and_draw(R)
if __name__ == '__main__':
flap_coin()