Advertisement
Guest User

Untitled

a guest
Mar 29th, 2015
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. static unsigned long int next = 1;
  5. static unsigned int bitsInNumber = 16;
  6.  
  7. double f_test(int n, unsigned int *ar);
  8. double equal_test(int n, unsigned int *ar);
  9. int period();
  10.  
  11. unsigned int rand(void)
  12. {
  13. next = next * 1103515245 + 12345;
  14. return (unsigned int) (next % 65536);
  15. }
  16.  
  17. void srand(unsigned int seed)
  18. {
  19. next = seed;
  20. }
  21.  
  22. int main() {
  23. FILE *fd = fopen("output.txt", "w");
  24. if(fd == NULL) {
  25. printf("Cant' open file\n");
  26. return 1;
  27. }
  28.  
  29. int i = 0;
  30. unsigned int array[100];
  31.  
  32. srand(time(NULL));
  33.  
  34. while( i < 100 ) {
  35. array[i] = rand();
  36. fprintf(fd, "%d\t", array[i]);
  37. ++i;
  38.  
  39. if(i % 10 == 0) {
  40. fprintf(fd, "\n");
  41. };
  42. }
  43.  
  44. /* printf("\n"); */
  45.  
  46. /* printf("%f\n", f_test(100, array));
  47. printf("%f\n", equal_test(100, array));
  48. printf("T = %d\n", period()); */
  49.  
  50. fclose(fd);
  51. return 0;
  52. }
  53.  
  54.  
  55. /* частотный побитовый тест */
  56. double f_test(int n, unsigned int *ar) {
  57. int s = 0;
  58. int nBits = n * bitsInNumber;
  59. int i,j;
  60. double sobs;
  61.  
  62. for(i = 0; i < n; ++i) {
  63. unsigned int temp = ar[i];
  64. for(j = 0; j < bitsInNumber; ++j) {
  65. if(temp & 1) {
  66. ++s;
  67. } else {
  68. --s;
  69. }
  70. temp = temp >> 1;
  71. }
  72. }
  73.  
  74. sobs = (double) abs(s) / sqrt(nBits);
  75.  
  76. return erfc((double) sobs/ sqrt(2));
  77. }
  78.  
  79. /* Тест на одинаковые идущие подряд биты */
  80. double equal_test(int n, unsigned int *ar) {
  81. int X = 0;
  82. int nBits = n * bitsInNumber;
  83. int i,j;
  84. unsigned int temp;
  85.  
  86. for(i = 0; i < n; ++i) {
  87. temp = ar[i];
  88. for(j = 0; j < bitsInNumber; ++j) {
  89. if(temp & 1) {
  90. ++X;
  91. }
  92. temp = temp >> 1;
  93. }
  94. }
  95.  
  96. double p = (double)X / (double)nBits;
  97. double absP = (p-0.5f) > 0 ? p-0.5f : -p+0.5f;
  98.  
  99. if( absP >= (2 / sqrt(nBits)) ) {
  100. return 0; /* последовательность тест не прошла */
  101. }
  102.  
  103. int V = 1;
  104. int Xi = ar[0] & 1;
  105. int Xj;
  106. for(i = 1; i < nBits - 1; ++i) {
  107. if(i % 16 == 0) {
  108. temp = ar[i / 16];
  109. }
  110.  
  111. Xj = (temp >> (i%16)) & 1;
  112. if(Xi != Xj) {
  113. ++V;
  114. }
  115. Xi = Xj;
  116. }
  117.  
  118. double chis = (double) V - 2*nBits*p*(1-p);
  119. chis = chis > 0 ? chis : -chis;
  120. return erfc( chis / (2*p*sqrt(2*nBits)*(1-p)) );
  121. }
  122.  
  123. /* Период последовательности */
  124. int period() {
  125. int T = 0;
  126.  
  127. srand(1);
  128. unsigned int first = rand();
  129. unsigned int n = rand();
  130.  
  131. while( first != n ) {
  132. ++T;
  133. n = rand();
  134. }
  135.  
  136. return T;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement