Random.inl
上传用户:fxromeo
上传日期:2010-04-08
资源大小:89k
文件大小:3k
开发平台:

Visual C++

  1. //random.inl 随机函数(方法)定义
  2. // Ver 1.0.0.0
  3. // 版权所有(C) 何渝, 2002
  4. // 最后修改: 2002.5.31.
  5. #ifndef _RANDOM_INL
  6. #define _RANDOM_INL
  7. //产生一个[0,1]区间内均匀分布伪随机数
  8. inline double 
  9. rand_01_One(double& seed)
  10. { //seed为随机数种子
  11. seed = ((unsigned long)seed) % MODUL65536; //以65536为模对种子取余
  12. seed = RandCoef2053 * (seed) + RandCoef13849; //乘、加系数
  13. seed = ((unsigned long)seed) % MODUL65536; //以65536为模对种子取余
  14. double rand = (seed) / (double)MODUL65536; //使随机数在[0,1]区间
  15. return( rand ); //返回随机值
  16. }
  17. //产生多个[0,1]区间内均匀分布伪随机数
  18. inline void 
  19. rand_01_Series(double& seed, valarray<double>& dp, const size_t stCount)
  20. { //seed为随机数种子,dp存放生成的随机数列,srCount指定要生成的随机数个数
  21. for(size_t st=0; st<stCount; st++)
  22. {
  23. seed = RandCoef2053 * (seed) + RandCoef13849;
  24. seed = (unsigned long)seed % MODUL65536; //以65536为模对种子取余
  25. dp[st] = seed / (double)MODUL65536;
  26. }
  27. }
  28. //产生任意[a,b]区间内一个均匀分布伪随机整数
  29. inline size_t 
  30. rand_ab_One(size_t a, size_t b, size_t& seed)
  31. { //a,b为区间左右端点,seed为种子
  32. size_t rand;
  33. size_t stk = b - a + 1;
  34. size_t stl = 2;
  35. while(stl < stk) stl = stl + stl;
  36. size_t modul = 4 * stl;
  37. stk = seed;
  38. size_t sti = 1;
  39. while(sti <= 1)
  40. {
  41. stk = 5 * stk;
  42. stk = stk % modul;
  43. stl = stk /4 +a;
  44. if (stl<=b)
  45. {
  46. rand=stl; 
  47. sti=sti+1;
  48. }
  49.       }
  50.     seed=stk;
  51.     return(rand);
  52. }
  53. //产生多个任意[a,b]区间内均匀分布伪随机整数序列
  54. inline void 
  55. rand_ab_Series(size_t a, size_t b, size_t& seed, valarray<size_t>& sp, size_t stCount)
  56. {   //a,b为区间左右端点,seed为种子,sp存放随机数序列,stCount指定随机数个数
  57. size_t stk = b - a + 1;
  58. size_t stl = 2;
  59. while(stl < stk) stl = stl + stl;
  60. size_t modul = 4 * stl;
  61. stk = seed;
  62. size_t sti = 0;
  63. while(sti < stCount)
  64. {
  65. stk = 5 * stk;
  66. stk = stk % modul;
  67. stl = stk / 4 +a;
  68. if (stl <= b)
  69. {
  70. sp[sti]=stl; 
  71. sti = sti + 1;
  72. }
  73.     }
  74.     seed=stk;
  75. }
  76. //产生任意均值与方差的一个正态分布随机数
  77. //函数的参数:mu和ro(μ和σ值)要事先给定,也可从其它程序中获得。
  78. //如果算法中的n值要取的更大(超过12),程序要稍加修改。
  79. inline double 
  80. rand_NormalDistributing_One(double mu, double ro, double& seed)
  81. {
  82. double rand = 0.0;
  83. for (size_t st=0; st<12; st++)
  84. {
  85. seed = RandCoef2053 * (seed) + RandCoef13849; //乘、加系数
  86. seed =(unsigned long)seed % MODUL65536; //以65536为模对种子取余
  87. rand = rand + (seed) / (double)MODUL65536;
  88. }
  89. rand = mu + ro * (rand - 6.0);
  90. return(rand);
  91. }
  92. //产生任意均值与方差的正态分布随机数序列
  93. //函数的参数:mu和ro(μ和σ值)要事先给定,也可从其它程序中获得。
  94. //如果算法中的n值要取的更大(超过12),程序要稍加修改。
  95. inline void 
  96. rand_NormalDistributing_Series(double mu, double ro, double seed, valarray<double>& dp, size_t stCount)
  97. { //seed为种子,dp存放随机数序列,stCount指定要生成的随机数个数
  98. for (size_t st = 0; st < stCount; st++)
  99. {
  100. double rand = 0.0;
  101. for (size_t sr=1; sr<=12; sr++)
  102. {
  103. seed = (seed) * RandCoef2053 + RandCoef13849;
  104. seed = (unsigned long)seed % MODUL65536; //以65536为模对种子取余
  105. rand = rand + (seed) / (double)MODUL65536;
  106. }
  107. dp[st] = mu + ro * (rand - 6.0);
  108. }
  109. }
  110. #endif //_RANDOM_INL