#include <algorithm>
#include <random>
#include <iostream>
#include <array>
#include <math.h>
static const int N = 8;
typedef std::array<double,N> ArrayT;
void SetMTRandomValue(ArrayT& Data){
std::mt19937 Rnd(1);
std::uniform_real_distribution<double> Dist(0,65535);
std::for_each(Data.begin(),Data.end(),[&](double& In){ In = pow(Dist(Rnd)*Dist(Rnd)*Dist(Rnd),1.0/3);});
}
void SetLARandomValue(ArrayT& Data){
std::minstd_rand Rnd(1);
std::uniform_real_distribution<double> Dist(0,65535);
std::for_each(Data.begin(),Data.end(),[&](double& In){ In = pow(Dist(Rnd)*Dist(Rnd)*Dist(Rnd),1.0/3);});
}
void GetMinMax(ArrayT& Data,double& Min,double& Max){
Min = Data[0];
Max = Data[0];
std::for_each(Data.begin(),Data.end(),[&](double& In){
if(In>Max) Max=In;
if(In<Min) Min=In;
});
}
int CountRangeValue(ArrayT Data,double Value,double Range){
double R= Range;
int Count=0;
std::for_each(Data.begin(),Data.end(),[&](double In){
if(Value <= In && In < (Value+R)) Count ++;
});
return Count;
}
double MakeAve(ArrayT Data,double Val){
int Count=0;
double Total=0;
std::for_each(Data.begin(),Data.end(),[&](double In){
if(In<Val) {
Total+= In;
Count++;
}
}
);
return Total/Count;
}
int main(){
ArrayT Data={5,4,3,6,7,8,12,13};
double Min,Max;
double NoiseP = 0.75;//何割くらいがノイズか。
//SetMTRandomValue(Data);
GetMinMax(Data,Min,Max);
int C=0;
double V = Min;
double P=0;
for(int i=1;C<(Data.size()*NoiseP);i++){
if(i==31) break;
int B = (1<<i);
double D = (Max-Min)/B;
C+= CountRangeValue(Data,V, D);
V+= D;
P = (V-Min)/(Max-Min);
}
double Ave = MakeAve(Data,Max*P);
std::cout<<"ave:"<<Ave<<std::endl;
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHJhbmRvbT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxtYXRoLmg+CgpzdGF0aWMgY29uc3QgaW50IE4gPSA4Owp0eXBlZGVmIHN0ZDo6YXJyYXk8ZG91YmxlLE4+IEFycmF5VDsKCnZvaWQgU2V0TVRSYW5kb21WYWx1ZShBcnJheVQmIERhdGEpewoJc3RkOjptdDE5OTM3IFJuZCgxKTsKCXN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+IERpc3QoMCw2NTUzNSk7CgoJc3RkOjpmb3JfZWFjaChEYXRhLmJlZ2luKCksRGF0YS5lbmQoKSxbJl0oZG91YmxlJiBJbil7IEluID0gcG93KERpc3QoUm5kKSpEaXN0KFJuZCkqRGlzdChSbmQpLDEuMC8zKTt9KTsKCQp9CnZvaWQgU2V0TEFSYW5kb21WYWx1ZShBcnJheVQmIERhdGEpewoJc3RkOjptaW5zdGRfcmFuZCBSbmQoMSk7CglzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248ZG91YmxlPiBEaXN0KDAsNjU1MzUpOwoKCXN0ZDo6Zm9yX2VhY2goRGF0YS5iZWdpbigpLERhdGEuZW5kKCksWyZdKGRvdWJsZSYgSW4peyBJbiA9IHBvdyhEaXN0KFJuZCkqRGlzdChSbmQpKkRpc3QoUm5kKSwxLjAvMyk7fSk7CgkKfQoKdm9pZCBHZXRNaW5NYXgoQXJyYXlUJiBEYXRhLGRvdWJsZSYgTWluLGRvdWJsZSYgTWF4KXsKCU1pbiA9IERhdGFbMF07CglNYXggPSBEYXRhWzBdOwoJc3RkOjpmb3JfZWFjaChEYXRhLmJlZ2luKCksRGF0YS5lbmQoKSxbJl0oZG91YmxlJiBJbil7IAoJCWlmKEluPk1heCkgTWF4PUluOwoJCWlmKEluPE1pbikgTWluPUluOwoJfSk7Cn0KCmludCBDb3VudFJhbmdlVmFsdWUoQXJyYXlUIERhdGEsZG91YmxlIFZhbHVlLGRvdWJsZSBSYW5nZSl7Cglkb3VibGUgUj0gUmFuZ2U7CglpbnQgQ291bnQ9MDsKCXN0ZDo6Zm9yX2VhY2goRGF0YS5iZWdpbigpLERhdGEuZW5kKCksWyZdKGRvdWJsZSBJbil7CgkJaWYoVmFsdWUgPD0gSW4gJiYgSW4gPCAoVmFsdWUrUikpIENvdW50ICsrOwoJfSk7CglyZXR1cm4gQ291bnQ7Cn0KCmRvdWJsZSBNYWtlQXZlKEFycmF5VCBEYXRhLGRvdWJsZSBWYWwpewoJaW50IENvdW50PTA7Cglkb3VibGUgVG90YWw9MDsKCXN0ZDo6Zm9yX2VhY2goRGF0YS5iZWdpbigpLERhdGEuZW5kKCksWyZdKGRvdWJsZSBJbil7CgkJaWYoSW48VmFsKSB7CgkJCVRvdGFsKz0gSW47CgkJCUNvdW50Kys7CgkJfQoJfQoJKTsKCXJldHVybiBUb3RhbC9Db3VudDsKCn0KCmludCBtYWluKCl7CglBcnJheVQgRGF0YT17NSw0LDMsNiw3LDgsMTIsMTN9OwoJZG91YmxlIE1pbixNYXg7Cglkb3VibGUgTm9pc2VQID0gMC43NTsvL+S9leWJsuOBj+OCieOBhOOBjOODjuOCpOOCuuOBi+OAggoJLy9TZXRNVFJhbmRvbVZhbHVlKERhdGEpOwoJR2V0TWluTWF4KERhdGEsTWluLE1heCk7CglpbnQgQz0wOwoJZG91YmxlIFYgPSBNaW47CiAKCWRvdWJsZSBQPTA7IAoJZm9yKGludCBpPTE7QzwoRGF0YS5zaXplKCkqTm9pc2VQKTtpKyspewoJCWlmKGk9PTMxKSBicmVhazsKCQlpbnQgQiA9ICgxPDxpKTsgCgkJZG91YmxlIEQgPSAoTWF4LU1pbikvQjsKCQlDKz0gQ291bnRSYW5nZVZhbHVlKERhdGEsViwgRCk7CgkJVis9IEQ7CgoJCVAgPSAoVi1NaW4pLyhNYXgtTWluKTsKCX0KCWRvdWJsZSBBdmUgPSBNYWtlQXZlKERhdGEsTWF4KlApOwoKCXN0ZDo6Y291dDw8ImF2ZToiPDxBdmU8PHN0ZDo6ZW5kbDsKCXJldHVybiAwOwoKfQ==