Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- static unsigned long int next = 1;
- static unsigned int bitsInNumber = 16;
- double f_test(int n, unsigned int *ar);
- double equal_test(int n, unsigned int *ar);
- int period();
- unsigned int rand(void)
- {
- next = next * 1103515245 + 12345;
- return (unsigned int) (next % 65536);
- }
- void srand(unsigned int seed)
- {
- next = seed;
- }
- int main() {
- FILE *fd = fopen("output.txt", "w");
- if(fd == NULL) {
- printf("Cant' open file\n");
- return 1;
- }
- int i = 0;
- unsigned int array[100];
- srand(time(NULL));
- while( i < 100 ) {
- array[i] = rand();
- fprintf(fd, "%d\t", array[i]);
- ++i;
- if(i % 10 == 0) {
- fprintf(fd, "\n");
- };
- }
- /* printf("\n"); */
- /* printf("%f\n", f_test(100, array));
- printf("%f\n", equal_test(100, array));
- printf("T = %d\n", period()); */
- fclose(fd);
- return 0;
- }
- /* частотный побитовый тест */
- double f_test(int n, unsigned int *ar) {
- int s = 0;
- int nBits = n * bitsInNumber;
- int i,j;
- double sobs;
- for(i = 0; i < n; ++i) {
- unsigned int temp = ar[i];
- for(j = 0; j < bitsInNumber; ++j) {
- if(temp & 1) {
- ++s;
- } else {
- --s;
- }
- temp = temp >> 1;
- }
- }
- sobs = (double) abs(s) / sqrt(nBits);
- return erfc((double) sobs/ sqrt(2));
- }
- /* Тест на одинаковые идущие подряд биты */
- double equal_test(int n, unsigned int *ar) {
- int X = 0;
- int nBits = n * bitsInNumber;
- int i,j;
- unsigned int temp;
- for(i = 0; i < n; ++i) {
- temp = ar[i];
- for(j = 0; j < bitsInNumber; ++j) {
- if(temp & 1) {
- ++X;
- }
- temp = temp >> 1;
- }
- }
- double p = (double)X / (double)nBits;
- double absP = (p-0.5f) > 0 ? p-0.5f : -p+0.5f;
- if( absP >= (2 / sqrt(nBits)) ) {
- return 0; /* последовательность тест не прошла */
- }
- int V = 1;
- int Xi = ar[0] & 1;
- int Xj;
- for(i = 1; i < nBits - 1; ++i) {
- if(i % 16 == 0) {
- temp = ar[i / 16];
- }
- Xj = (temp >> (i%16)) & 1;
- if(Xi != Xj) {
- ++V;
- }
- Xi = Xj;
- }
- double chis = (double) V - 2*nBits*p*(1-p);
- chis = chis > 0 ? chis : -chis;
- return erfc( chis / (2*p*sqrt(2*nBits)*(1-p)) );
- }
- /* Период последовательности */
- int period() {
- int T = 0;
- srand(1);
- unsigned int first = rand();
- unsigned int n = rand();
- while( first != n ) {
- ++T;
- n = rand();
- }
- return T;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement