eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingJak zrobić test za pomocą PractRand? › Re: Jak zrobić test za pomocą PractRand?
  • Data: 2021-09-23 02:55:30
    Temat: Re: Jak zrobić test za pomocą PractRand?
    Od: "o...@g...com" <o...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Bardzo szybki powinien też być ulepszony przeze mnie PCG Melissy O'Neil o nazwie
    XSL-RR-RR (128-bitowy, choć można stworzyć też wersje 64-bitowe i 32-bitowe):

    https://en.wikipedia.org/wiki/Permuted_congruential_
    generator

    Normalnie oblewa on dosyć szybko testy PractRand (kod w Pythonie, sam mixer pewnie
    można napisać lepiej w C, może jako jakieś macro):

    import struct
    import sys

    x = 83866140117348733064738400095399246193
    #seed

    def PCGmixer(x):
    count1 = x >> 122
    x1 = (x ^ (x >> 64)) & 18446744073709551615
    low64 = (x1 >> count1) | (x1 << (64 - count1)) & 18446744073709551615
    x2 = (x >> 64) & 18446744073709551615
    count2 = low64 & 63
    high64 = (x2 >> count2) | (x2 << (64 - count2)) & 18446744073709551615
    x = (high64 << 64) | low64
    return x

    def LCG(x):
    x = (x * 47026247687942121848144207491837523525 +
    83866140218348733064834828227924511723) & 340282366920938463463374607431768211455
    return x

    while 1 == 1:

    x=LCG(x)
    w=PCGmixer(x)

    split = [(w >> x) & 0xFFFFFFFF for x in reversed(range(0, 128, 32))]
    binary = struct.pack('IIII', split[0], split[1], split[2], split[3])
    sys.stdout.buffer.write(binary)

    Ale wystarczy dodać xorowanie kolejnych wyników:

    import struct
    import sys

    x = 83866140117348733064738400095399246193

    def PCGmixer(x):
    count1 = x >> 122
    x1 = (x ^ (x >> 64)) & 18446744073709551615
    low64 = (x1 >> count1) | (x1 << (64 - count1)) & 18446744073709551615
    x2 = (x >> 64) & 18446744073709551615
    count2 = low64 & 63
    high64 = (x2 >> count2) | (x2 << (64 - count2)) & 18446744073709551615
    x = (high64 << 64) | low64
    return x

    def LCG(x):
    x = (x * 47026247687942121848144207491837523525 +
    83866140218348733064834828227924511723) & 340282366920938463463374607431768211455
    return x

    w=0

    while 1 == 1:

    w_1 = w

    x=LCG(x)
    w=PCGmixer(x)

    w_2 = w_1 ^ w

    #split = [(w_2 >> x) & 0xFFFFFFFF for x in reversed(range(0, 128, 32))]
    #binary = struct.pack('IIII', split[0], split[1], split[2], split[3])
    #sys.stdout.buffer.write(binary)

    Żeby zdawał on testy. Oczywiście sam PCGmixer wydłuża czas pracy istotnie (względem
    bazowego LCG), ale pewnie można go wykonywać szybciej.


Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: