本帖最后由 爱飞的猫 于 2024-5-8 05:36 编辑
概率不对;一个好的随机算法,应当让生成任意指定范围数字的概率差不多趋势与一致(如果实验次数足够多)。
例如我扔骰子,运气不错连续两次扔到 6。根据你的程序算法,此时会停止,并认为碰到 6 的概率是 100%。此时样本过小,会不足以支撑这个数字。
import random
import secrets
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
USE_SYSTEM_RANDOM = False # 改为 True 使用 SystemRandom
TEST_COUNT = 1000 * 1000 * 1000
# 计数器
counter = [0] * 100
# 生成随机数
rnd = secrets.SystemRandom() if USE_SYSTEM_RANDOM else random.Random()
for _ in range(1000 * 100):
number = rnd.randint(1, 100)
counter[number - 1] += 1
# 出图
_, ax = plt.subplots()
ax.bar(range(1, 101), counter, align='center')
# 默认情况下无法渲染 CJK 字符,姑且写死一个 Windows 下的字体路径凑合用
font = fm.FontProperties(fname="C:/Windows/Fonts/msyh.ttc", size=14)
ax.set_title('随机分布', fontproperties=font)
ax.set_xlabel('数值', fontproperties=font)
ax.set_ylabel('次数', fontproperties=font)
plt.show()
当然,每次执行时,不同值出现的频率都会上下摇摆一部分。
|