Koodi kannattaa aina hajottaa ja hallita. Otin testeissäni melko hyvin menestyneen koodin, joka ei täyttänyt yhtä yksinkertaista random-osa-testiä, koska koodissa oli bugi.Perusajatus oli siinä pläjäyksessä hyvä. Se piti vain koodata uudelleen, jotta ajatusvirhe löytyi.
No, koodasin uudelleen ja lyhensin ja yksinkertaistin sitä. Löytyi yksi ajatusvirhe, joka ajoi random-ominaisuuden huidsin nevadaan. Esimerkiksi funktiosta inc4 jäi jäljelle vain yksi parametri.
Se siitä. Random-funktiolla on tapana olla jonkin pituinen sykli, jonka jälkeen funktio rupeaa toistamaan sitä. Jos tämän version sykliä arvioi varovasti, se on vähintään kertoma(34).
Olisi mukava nähdä se testi, joka paljastaisi tästä koodista bugin. Tai toiston ennemmin kuin kertoma(34). Oikeastaan olen fundeerannut tuon syklin pituutta, ja tämä pläjäys – no, kokeile itse tehdä testi, jota tämä random ei läpäisisi. Tasainen jakauma, jne.
Tämän jälkeen tämän ongelman voi ottaa pöytälaatikosta ja leimata se onnistuneeksi onnistuneiden koodien jatkoon... Nyt on ollut aikaa fundeerata, koska odotan leikkaukseen aikaa, jossa poikkinainen solisluu naulataan titaanilevyllä yhteen.
#include <stdio.h> #include <memory.h> class xxcx { public: xxcx(void); ~xxcx(void); void debug(void); unsigned rnd(unsigned); private: void inc4(void); unsigned tmp32(void); unsigned R16A, R16B; int Z, p0, p1, p2, p3; }; xxcx::xxcx(void) { memset(this, 0, sizeof(xxcx)); } xxcx::~xxcx(void) { } unsigned avain[32]= { 0xaacc6600, 0x2d4be187, 0xbbdd7711, 0x3c5af096, 0x88ee4422, 0x0f69c3a5, 0x99ff5533, 0x1e78d2b4, 0xee882244, 0x690fa5c3, 0xff993355, 0x781eb4d2, 0xccaa0066, 0x4b2d87e1, 0xddbb1177, 0x5a3c96f0, 0x2244ee88, 0xa5c3690f, 0x3355ff99, 0xb4d2781e, 0x0066ccaa, 0x87e14b2d, 0x1177ddbb, 0x96f05a3c, 0x6600aacc, 0xe1872d4b, 0x7711bbdd, 0xf0963c5a, 0x442288ee, 0xc3a50f69, 0x553399ff, 0xd2b41e78, }; inline void xxcx::inc4(void) { ++Z; p0=Z&31; p1=(Z>>5)&31; p2=(Z>>10)&31; p3=(Z>>15)&31; } inline unsigned xxcx::tmp32(void) { R16A+=(avain[p0]>>16)^(avain[p1]<<16); R16B-=(avain[p0]<<16)^(avain[p1]>>16); R16A-=avain[p2]; R16B+=avain[p3]; inc4(); return R16A^R16B; } inline void swap(unsigned &x, unsigned &y) { register unsigned z=x; x=y; y=z; } inline unsigned xxcx::rnd(unsigned max) { register unsigned x=tmp32()&31; register unsigned y=tmp32()&31; swap(avain[x], avain[y]); return tmp32()%max; } ///////////////////////////////////// #define KPL 2 // Tällä parametril- // // la voi säätää tutkittavan // // numerosarjan pituutta. main- // // funktio ottaa sitten selvää // // sekvenssin jakaumasta. // ///////////////////////////////////// int main(void) { unsigned maxKpl[KPL]; unsigned ketjut[KPL]; xxcx F; memset(maxKpl, 0, sizeof(unsigned)*KPL); memset(ketjut, 0, sizeof(unsigned)*KPL); for (int n, ede=0, print=0;;) { n=F.rnd(KPL); ketjut[n]+=1; for (int i=0; i<KPL; i++) { if (ketjut[i]!=maxKpl[i]) { if (ketjut[i]>maxKpl[i]) { maxKpl[i]=ketjut[i]; print=1; } } } if (n!=ede && print==0) { ede=n; memset(ketjut, 0, sizeof(unsigned)*KPL); } if (print) { print=0; memset(ketjut, 0, sizeof(unsigned)*KPL); printf("| "); for (int i=0; i<KPL; i++) printf("%u | ", maxKpl[i]); printf("\n"); } } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.