Dieharder 随机测试套件 - 令人怀疑的好结果
Dieharder random test suite - suspiciously good results
我根据以下生成器生成了一个 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 中 header:
#==================================================================
# generator lcg seed = 1
#==================================================================
type: d
count: 100000
numbit: 32
1015568748
1586005467
2165703038
3027450565
217083232
1587069247
......
我打电话给:
dieharder -g 202 -f testrands.txt -a
现在结果出奇的弱(可能是我生成的数字太少了?)
我也不确定是否所有这些测试都适合 LCG 测试,但结果出奇地弱
我按照指南中的说明进行操作,但似乎仍然不尽如人意 - LCG 通过了 birthday-spacing(我认为不应该),其余结果出奇地薄弱
我根据以下生成器生成了一个 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 中 header:
#==================================================================
# generator lcg seed = 1
#==================================================================
type: d
count: 100000
numbit: 32
1015568748
1586005467
2165703038
3027450565
217083232
1587069247
......
我打电话给:
dieharder -g 202 -f testrands.txt -a
现在结果出奇的弱(可能是我生成的数字太少了?)
我也不确定是否所有这些测试都适合 LCG 测试,但结果出奇地弱
我按照指南中的说明进行操作,但似乎仍然不尽如人意 - LCG 通过了 birthday-spacing(我认为不应该),其余结果出奇地薄弱