fork download
  1. #include <algorithm>
  2. #include <random>
  3. #include <iostream>
  4. #include <array>
  5. #include <math.h>
  6.  
  7. static const int N = 8;
  8. typedef std::array<double,N> ArrayT;
  9.  
  10. void SetMTRandomValue(ArrayT& Data){
  11. std::mt19937 Rnd(1);
  12. std::uniform_real_distribution<double> Dist(0,65535);
  13.  
  14. std::for_each(Data.begin(),Data.end(),[&](double& In){ In = pow(Dist(Rnd)*Dist(Rnd)*Dist(Rnd),1.0/3);});
  15.  
  16. }
  17. void SetLARandomValue(ArrayT& Data){
  18. std::minstd_rand Rnd(1);
  19. std::uniform_real_distribution<double> Dist(0,65535);
  20.  
  21. std::for_each(Data.begin(),Data.end(),[&](double& In){ In = pow(Dist(Rnd)*Dist(Rnd)*Dist(Rnd),1.0/3);});
  22.  
  23. }
  24.  
  25. void GetMinMax(ArrayT& Data,double& Min,double& Max){
  26. Min = Data[0];
  27. Max = Data[0];
  28. std::for_each(Data.begin(),Data.end(),[&](double& In){
  29. if(In>Max) Max=In;
  30. if(In<Min) Min=In;
  31. });
  32. }
  33.  
  34. int CountRangeValue(ArrayT Data,double Value,double Range){
  35. double R= Range;
  36. int Count=0;
  37. std::for_each(Data.begin(),Data.end(),[&](double In){
  38. if(Value <= In && In < (Value+R)) Count ++;
  39. });
  40. return Count;
  41. }
  42.  
  43. double MakeAve(ArrayT Data,double Val){
  44. int Count=0;
  45. double Total=0;
  46. std::for_each(Data.begin(),Data.end(),[&](double In){
  47. if(In<Val) {
  48. Total+= In;
  49. Count++;
  50. }
  51. }
  52. );
  53. return Total/Count;
  54.  
  55. }
  56.  
  57. int main(){
  58. ArrayT Data={5,4,3,6,7,8,12,13};
  59. double Min,Max;
  60. double NoiseP = 0.75;//何割くらいがノイズか。
  61. //SetMTRandomValue(Data);
  62. GetMinMax(Data,Min,Max);
  63. int C=0;
  64. double V = Min;
  65.  
  66. double P=0;
  67. for(int i=1;C<(Data.size()*NoiseP);i++){
  68. if(i==31) break;
  69. int B = (1<<i);
  70. double D = (Max-Min)/B;
  71. C+= CountRangeValue(Data,V, D);
  72. V+= D;
  73.  
  74. P = (V-Min)/(Max-Min);
  75. }
  76. double Ave = MakeAve(Data,Max*P);
  77.  
  78. std::cout<<"ave:"<<Ave<<std::endl;
  79. return 0;
  80.  
  81. }
Success #stdin #stdout 0s 2932KB
stdin
Standard input is empty
stdout
ave:5.5