RDM из OSCAT'а на длине 1'000'000 бит
Проходит 3 теста:
Rank
FFT
LinearComplexity
Не проходит:
Frequency (проходит 0 из 10)
BlockFrequency (проходит 3 раза из 10)
CumulativeSums (0 из 10)
Runs (0 из 10)
LongestRun (проходит 9 раз из 10)
NonOverlappingTemplate
OverlappingTemplate (7 из 10)
Universal (9 из 10)
ApproximateEntropy (0 из 10)
Serial
Код:
// Переписано отсюда: https://github.com/simsum/oscat/blob/master/RDM.EXP
unsigned int bit_count(unsigned int n) {
unsigned int c;
for (c=0;n>0;n=n&(n-1)) c++;
return c;
}
unsigned int rol(unsigned int x, unsigned int n){
return (x<<n)|(x>>(32-n));
}
float rdm(float last) {
float rdm;
tn = T_PLC_MS;
tc = bit_count(tn);
tn |= (tn&(1<<(2)))<<(31-2);
tn |= (tn&(1<<(5)))<<(30-5);
tn |= (tn&(1<<(4)))<<(29-4);
tn |= (tn&(1<<(1)))<<(28-1);
tn |= (tn&(1<<(0)))<<(27-0);
tn |= (tn&(1<<(7)))<<(26-7);
tn |= (tn&(1<<(6)))<<(25-6);
tn |= (tn&(1<<(3)))<<(24-3);
tn = rol(tn, bit_count(tn)) | 0x80000001;
tn = tn % 71474513 + (tc + 77);
rdm = ((float)tn) / 10000000.0 * (E - (last<0.0 ? 0 : (last>1.0?1.0:last) ));
rdm = rdm - floor(rdm);
T_PLC_MS+=10;
return rdm;
}