Advertisement
stream13

Coin Probability test

Mar 16th, 2016
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.78 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5.  
  6. #define TRUE        1
  7. #define FALSE       0
  8. #define KURWA      -1
  9. #define MASK        1
  10. #define CND_ALICE   2
  11. #define CND_BOB     3
  12. #define SET_6BIT 0xFC
  13.  
  14. #define CLR_BITS(val) ((val) &= (3))
  15.  
  16. uint8_t get_byte(int32_t fd){
  17.     uint8_t retval;
  18.     if(1 != read(fd, &retval, 1)){
  19.         fprintf(stderr, "Kurwa! Nie czytam plik!\n");
  20.         _exit(KURWA);
  21.     }
  22.     return retval;
  23. }
  24.  
  25. void run_test(uint64_t iterations, uint8_t run_orthogonaly, uint8_t do_flush){
  26.     uint64_t count_alice;
  27.     uint64_t count_bob;
  28.     uint64_t i;
  29.     int32_t urandom_fd;
  30.     uint8_t buf;
  31.     uint8_t buf_alice;
  32.     uint8_t buf_bob;
  33.     uint8_t cap_alice;
  34.     uint8_t cap_bob;
  35.     float retval_alice;
  36.     float retval_bob;
  37.  
  38.     buf_alice = 0;
  39.     buf_bob = 0;
  40.     count_alice = 0;
  41.     count_bob = 0;
  42.  
  43.     urandom_fd = open("/dev/urandom", O_RDONLY);
  44.     if(KURWA == urandom_fd){
  45.         fprintf(stderr, "Kurwa! Cos nie otworzylem plik!\n");
  46.         _exit(KURWA);
  47.     }
  48.     for(i = 0; i < iterations; ++i){
  49.         buf = get_byte(urandom_fd);
  50.         buf_alice <<= 1;
  51.         buf_alice += buf & MASK;
  52.         CLR_BITS(buf_alice);
  53.  
  54.         if(TRUE == run_orthogonaly){
  55.             buf = get_byte(urandom_fd);
  56.         }
  57.  
  58.         buf_bob   <<= 1;
  59.         buf_bob   += buf & MASK;
  60.         CLR_BITS(buf_bob);
  61.  
  62.  
  63.         if(do_flush){
  64.             ++cap_alice;
  65.             ++cap_bob;
  66.             if(1 < cap_alice){
  67.                 if(CND_ALICE == buf_alice){
  68.                     ++count_alice;
  69.                     cap_alice = 0;
  70.                 }
  71.             }
  72.             if(1 < cap_bob){
  73.                 if(CND_BOB == buf_bob){
  74.                     cap_bob = 0;
  75.                     ++count_bob;
  76.                 }
  77.             }
  78.         }else{
  79.             if(CND_ALICE == buf_alice)
  80.                 ++count_alice;
  81.             if(CND_BOB == buf_bob)
  82.                 ++count_bob;
  83.         }
  84.     }
  85.     retval_alice = (float)iterations/(float)count_alice;
  86.     retval_bob   = (float)iterations/(float)count_bob;
  87.     fprintf(stdout, "Iterations\t= %lu\nOrthogonality\t: %s\nFlushing\t: %s\n",
  88.             iterations,
  89.             run_orthogonaly ? "Enabled" : "Disabled",
  90.             do_flush ? "Enabled" : "Disabled");
  91.     fprintf(stdout, "Alice\t\t= %f\n", retval_alice);
  92.     fprintf(stdout, "Bob\t\t= %f\n\n", retval_bob);
  93.  
  94.     if(KURWA == close(urandom_fd)){
  95.         fprintf(stderr, "Kurwa! Bled przy zamykaniu plika!\n");
  96.         _exit(KURWA);
  97.     }
  98. }
  99.  
  100. int main(void){
  101.     const uint64_t iterations = 100000;
  102.  
  103.     run_test(iterations, FALSE, FALSE);
  104.     run_test(iterations, TRUE,  FALSE);
  105.     run_test(iterations, FALSE, TRUE );
  106.     run_test(iterations, TRUE,  TRUE );
  107.  
  108.  
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement