fork download
  1. // kadai1-2.cpp
  2. // ex) plot "???.txt" w boxes
  3. #define _USE_MATH_DEFINES
  4. #include <math.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8.  
  9. //ランダムウォークのステップ数
  10. const int STEPS = 1000;
  11.  
  12. const int RANDOMS = 1000; //生成する乱数の個数
  13. const int LOWER_LIMIT = 0; //ヒストグラムの下限と
  14. const int UPPER_LIMIT = 99; //上限
  15. const int DIVISION = 1; //分割数(1の幅をDIVISION等分)
  16.  
  17. //0以上1未満の一様乱数を生成する
  18. double frand()
  19. {
  20. return rand() / (RAND_MAX+1.0);
  21. }
  22.  
  23. //Box-Muller法で標準正規乱数を生成する
  24. double box_muller()
  25. {
  26. //Box-Muller法は2個の一様乱数から2個の正規乱数を生成する
  27. //そのうち一方はすぐに返し、もう一方は次に呼び出されたときに返す
  28. static bool haveRandom = false;
  29. static double random;
  30.  
  31. if(haveRandom){
  32. //正規乱数はすでにできている
  33. haveRandom = false;
  34. return random;
  35. } else {
  36. //正規乱数は手元にないので新しく2個の正規乱数を作る
  37. double u1 = sqrt(-2*log(1-frand()));
  38. double u2 = 2*M_PI*frand();
  39.  
  40. //2個のうち一方は次の呼び出しのためにとっておく
  41. haveRandom = true;
  42. random = u1 * sin(u2);
  43.  
  44. //もう一方を返す
  45. return u1 * cos(u2);
  46. }
  47. }
  48.  
  49. int main()
  50. {
  51. double x, y, d;
  52. int i, step, h;
  53.  
  54. //乱数を初期化する
  55. srand((unsigned int)time(NULL));
  56.  
  57. //頻度を記録する配列、0で初期化
  58. int hist[(UPPER_LIMIT - LOWER_LIMIT) * DIVISION + 1] = {0};
  59.  
  60. for (i = 0; i < RANDOMS; i++) {
  61. //STEPSステップのランダムウォークを実施する
  62. x = y = 0.0;
  63. for (step = 0; step < STEPS; step++) {
  64. x += box_muller();
  65. y += box_muller();
  66. }
  67. d = sqrt(x * x + y * y);
  68. h = (int)d;
  69. if (h <= UPPER_LIMIT) {
  70. hist[h]++;
  71. }
  72. }
  73. for (h = LOWER_LIMIT; h <= UPPER_LIMIT; h++) {
  74. printf("%3d %d\n", h, hist[h]);
  75. }
  76.  
  77. return 0;
  78. }
  79.  
Success #stdin #stdout 0.26s 2724KB
stdin
Standard input is empty
stdout
  0 0
  1 1
  2 4
  3 0
  4 3
  5 9
  6 5
  7 14
  8 9
  9 10
 10 10
 11 11
 12 16
 13 7
 14 13
 15 16
 16 20
 17 21
 18 15
 19 17
 20 15
 21 19
 22 10
 23 20
 24 15
 25 27
 26 16
 27 21
 28 15
 29 9
 30 22
 31 20
 32 23
 33 15
 34 20
 35 12
 36 23
 37 20
 38 14
 39 16
 40 15
 41 11
 42 13
 43 9
 44 31
 45 15
 46 19
 47 16
 48 25
 49 16
 50 13
 51 14
 52 14
 53 13
 54 14
 55 13
 56 9
 57 7
 58 8
 59 14
 60 5
 61 7
 62 8
 63 10
 64 9
 65 2
 66 8
 67 12
 68 12
 69 4
 70 5
 71 5
 72 8
 73 6
 74 3
 75 2
 76 4
 77 5
 78 5
 79 4
 80 2
 81 2
 82 5
 83 2
 84 1
 85 1
 86 2
 87 0
 88 2
 89 1
 90 2
 91 0
 92 2
 93 2
 94 0
 95 0
 96 0
 97 0
 98 2
 99 2