gpt4 book ai didi

python - LCG 是否像我的代码所示的那样严重未能通过 Kolmogorov-Smirnov 测试?

转载 作者:行者123 更新时间:2023-11-30 21:53:18 24 4
gpt4 key购买 nike

我使用以下Python代码向学生演示随机变量的生成:

import numpy as np
import scipy.stats as stats

def lcg(n, x0, M=2**32, a=1103515245, c=12345):
result = np.zeros(n)
for i in range(n):
result[i] = (a*x0 + c) % M
x0 = result[i]

return np.array([x/M for x in result])

x = lcg(10**6, 3)
print(stats.kstest(x, 'uniform'))

根据维基百科,默认参数是 glibc 使用的参数。代码的最后一行打印

KstestResult(statistic=0.043427751892089805, pvalue=0.0)

p 值为 0.0 表示,如果 x 的元素真正按照均匀分布分布,则观察结果基本上不会发生。我的问题是:我的代码中是否存在错误,或者具有给定参数的 LCG 是否未通过 10**6 副本的 Kolmogorov-Smirnov 测试?

最佳答案

你的代码有问题,它使得均匀分布如

enter image description here

我对您的 LCG 实现进行了一些更改,现在一切都很好(Python 3.7、Anaconda、Win10 x64)

import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt

def lcg(n, x0, M=2**32, a=1103515245, c=12345):
result = np.zeros(n)
for i in range(n):
x0 = (a*x0 + c) % M
result[i] = x0

return np.array([x/float(M) for x in result])

#x = np.random.uniform(0.0, 1.0, 1000000)
x = lcg(1000000, 3)
print(stats.kstest(x, 'uniform'))

count, bins, ignored = plt.hist(x, 15, density=True)
plt.plot(bins, np.ones_like(bins), linewidth=2, color='r')
plt.show()

打印内容

KstestResult(statistic=0.0007238884545415214, pvalue=0.6711878724246786)

和绘图

enter image description here

更新

正如@pjs指出的,你最好在循环中除以float(M),不需要第二次遍历整个数组

def lcg(n, x0, M=2**32, a=1103515245, c=12345):
result = np.empty(n)
for i in range(n):
x0 = (a*x0 + c) % M
result[i] = x0 / float(M)

return result

关于python - LCG 是否像我的代码所示的那样严重未能通过 Kolmogorov-Smirnov 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59703748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com