我根据以下生成器生成了一个txt文件(2500000个数字)
import numpy as np
class LCG(object):
UZERO: np.uint32 = np.uint32(0)
UONE : np.uint32 = np.uint32(1)
def __init__(self, seed: np.uint32, a: np.uint32, c: np.uint32) -> None:
self._seed: np.uint32 = np.uint32(seed)
self._a : np.uint32 = np.uint32(a)
self._c : np.uint32 = np.uint32(c)
def next(self) -> np.uint32:
self._seed = self._a * self._seed + self._c
return self._seed
def seed(self) -> np.uint32:
return self._seed
def set_seed(self, seed: np.uint32) -> np.uint32:
self._seed = seed
def skip(self, ns: np.int32) -> None:
"""
Signed argument - skip forward as well as backward
The algorithm here to determine the parameters used to skip ahead is
described in the paper F. Brown, "Random Number Generation with Arbitrary Stride,"
Trans. Am. Nucl. Soc. (Nov. 1994). This algorithm is able to skip ahead in
O(log2(N)) operations instead of O(N). It computes parameters
A and C which can then be used to find x_N = A*x_0 + C mod 2^M.
"""
nskip: np.uint32 = np.uint32(ns)
a: np.uint32 = self._a
c: np.uint32 = self._c
a_next: np.uint32 = LCG.UONE
c_next: np.uint32 = LCG.UZERO
while nskip > LCG.UZERO:
if (nskip & LCG.UONE) != LCG.UZERO:
a_next = a_next * a
c_next = c_next * a + c
c = (a + LCG.UONE) * c
a = a * a
nskip = nskip >> LCG.UONE
self._seed = a_next * self._seed + c_next
#%%
np.seterr(over='ignore')
a = np.uint32(1664525)
c = np.uint32(1013904223)
seed = np.uint32(1)
rng = LCG(seed, a, c)
q = [rng.next() for _ in range(0, 2500000)]
我使用以下代码保存了文件:
第一个单元格
%%capture cap --no-stderr
print(q)
第二个单元格
with open('output5.txt', 'w') as f:
f.write(cap.stdout)
然后我使用Diehard suite以以下方式执行测试:
dieharder -f output5.txt -a
我不确定测试是否在我的txt文件上运行,也不确定我的txt文件是否正确。250万个数字的样本约为30mb。你知道吗
我很惊讶所有的测试都进行得很顺利。你知道吗
下面是终端的结果。你知道吗
我很困惑,因为名字是MT19937
-这不是我的名字,文件“output5.txt”是我的文件。我不知道这些测试是不是在我的档案上进行的
我用生成器生成了250万行,保存到文件中testrands.txt文件使用此标题:
我打电话给:
现在的结果出奇的弱(也许我生成的数字太少?)你知道吗
我也不确定是否所有这些测试都适合LCG测试,但结果出人意料的弱
我照指南上的做了,但似乎还是有些不应该做的事情——LCG过了一个生日间隔(我认为不应该),剩下的结果出奇的弱
相关问题 更多 >
编程相关推荐