Набор случайных тестов Dieharder - подозрительно хорошие результаты

Я сгенерировал текстовый файл на основе следующего генератора (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 для проведения испытаний следующим образом:

dieharder -f output5.txt -a

Я не уверен, что тесты действительно выполняются на моем текстовом файле и правильный ли мой текстовый файл. Выборка из 2,5 миллионов номеров составляет около 30 МБ.

Я удивлен, что все тесты идут хорошо.

Ниже приведен результат в терминале.

Я в замешательстве, потому что имя MT19937 - это не мое имя, а файл "output5.txt" - это мой файл. Я не знаю, проводятся ли тесты в моем файле

1 ответ

Я генерирую 2,5 млн строк с генератором и сохраняю их в файл testrands.txt с таким заголовком:

#==================================================================
# 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 проходит день рождения (я думаю, что не должно), а остальные результаты на удивление слабые

Другие вопросы по тегам