/*匕首抽样*/
#include<iostream>
#include<iomanip>
using namespace std;
#include<math.h>
#define Pi 3.1415926
#define Tmax 10000
#define dT 50
#define Nm 200
#define N 10000
double Q=0.05;
double q[3]={0.56,0.39,0.05};
int u[3]={1200,1000,800};
int s[3]={60,40,20};
int r=3000;
double Ndt[Nm];
double No;
double Nc[7];
double Nn;
double Ts;
double T[4];
int RN;
long seed;
double Wn[8];//Wn0,A;Wn1,B;Wn2,C;Wn3,S1;Wn4,S2;Wn5,S3;Wn6,S;Wn7,Q;
double R[Nm];
double MTBF;
double Random1(int u1,int s1)
{
int i;
int q;
int k;
int a;
int c;
long m;
double OutNumber;
double Y[2];
q=25;
a=4*q+1;
c=31;
k=20;
m=pow(double(2),k);
for(i=0;i<=1;i++)
{
seed=(a*seed+c)%m;
Y[i]=long double(seed)/m;
}
OutNumber=sqrt(-2*log(Y[0]))*cos(2*Pi*Y[1])*s1+u1;
RN=RN+2;
if(RN<m)
{
return OutNumber;
}
else
{
cout<<"Error!"<<endl;
return 0;
}
}
double Random2(int r1)
{
int i;
int q;
int k;
int a;
int c;
long m;
double OutNumber;
double Y;
q=25;
a=4*q+1;
c=31;
k=20;
m=pow(double(2),k);
seed=(a*seed+c)%m;
Y=double(seed)/m;
OutNumber=-r1*log(1-Y);
RN++;
if(RN<m)
{
return OutNumber;
}
else
{
cout<<"Error!"<<endl;
return 0;
}
}
void NA(double a)
{
Nc[0]+=a;
}
void NB(double a)
{
Nc[1]+=a;
}
void NC(double a)
{
Nc[2]+=a;
}
void NS1(double a)
{
Nc[3]+=a;
}
void NS2(double a)
{
Nc[4]+=a;
}
void NS3(double a)
{
Nc[5]+=a;
}
void NQ(double a)
{
Nc[6]+=a;
}
void Tinit()
{
int i;
for(i=0;i<=2;i++)
{
T[i]=Random1(u[i],s[i]);
}
T[3]=Random2(r);
}
void Value(double i)
{
int j;
int Flag;
Flag=0;
for(j=0;(j<=Nm)&&(Flag==0);j++)
{
if(Ts<(j+1)*dT)
{
Ndt[j]+=i;
Flag=1;
}
}
if(Flag==0)
{
No++;
}
}
void QF1()
{
bool F;
double n;
if(T[0]>=T[3])
{
if(T[1]>=T[0])
{
if(T[2]>=T[1])
{
Ts=T[2];
n=100*q[0]*(1-Q)*(1-Q);
NA(n);
NB(n);
NC(n);
NS1(n);
Value(n);
}
else
{
Ts=T[1];
n=100*q[0]*(1-Q)*(1-Q);
NA(n);
NB(n);
NC(n);
NS1(n);
Value(n);
}
Ts=T[1];
n=100*q[0]*(1-Q)*Q;
NA(n);
NB(n);
NS1(n);
NQ(n);
Value(n);
}
else
{
if(T[2]>=T[0])
{
Ts=T[2];
n=100*q[0]*(1-Q)*(1-Q);
NA(n);
NB(n);
NC(n);
NS1(n);
Value(n);
}
else
{
Ts=T[0];
n=100*q[0]*(1-Q)*(1-Q);
NA(n);
NB(n);
NC(n);
NS1(n);
Value(n);
}
Ts=T[0];
n=100*q[0]*(1-Q)*Q;
NA(n);
NB(n);
NS1(n);
NQ(n);
Value(n);
}
Ts=T[0];
n=100*q[0]*Q;
NA(n);
NS1(n);
NQ(n);
Value(n);
}
else
{
if(T[1]>=T[3])
{
if(T[2]>=T[1])
{
Ts=T[2];
n=100*q[0]*(1-Q);
NA(n);
NB(n);
NC(n);
NS1(n);
Value(n);
}
else
{
Ts=T[1];
n=100*q[0]*(1-Q);
NA(n);
NB(n);
NC(n);
NS1(n);
Value(n);
}
Ts=T[1];
n=100*q[0]*Q;
NA(n);
NB(n);
NS1(n);
NQ(n);
Value(n);
}
else
{
Ts=max(max(T[0],T[1]),T[2]);
n=100*q[0];
NA(n);
NB(n);
NC(n);
Value(n);
}
}
}
void QF2()
{
bool F;
double n;
if(T[0]>=T[3])
{
if(T[1]>=T[3])
{
if(T[2]>=T[1])
{
Ts=T[2];
n=100*q[1]*(1-Q);
NB(n);
NC(n);
NS2(n);
Value(n);
}
else
{
Ts=T[1];
n=100*q[1]*(1-Q);
NB(n);
NC(n);
NS2(n);
Value(n);
}
Ts=T[1];
n=100*q[1]*Q;
NB(n);
NS2(n);
NQ(n);
Value(n);
}
else
{
if(T[2]>=T[3])
{
Ts=T[2];
n=100*q[1]*(1-Q);
NB(n);
NC(n);
NS2(n);
Value(n);
}
else
{
Ts=T[3];
n=100*q[1]*(1-Q);
NB(n);
NC(n);
NS2(n);
Value(n);
}
Ts=T[3];
n=100*q[1]*Q;
NB(n);
NS2(n);
NQ(n);
Value(n);
}
}
else
{
if(T[1]>=T[3])
{
if(T[2]>=T[3])
{
Ts=T[2];
n=100*q[1];
NA(n);
NC(n);
NS2(n);
Value(n);
}
else
{
Ts=T[3];
n=100*q[1];
NA(n);
NC(n);
NS2(n);
Value(n);
}
}
else
{
Ts=max(max(T[0],T[1]),T[2]);
n=100*q[1];
NA(n);
NB(n);
NC(n);
Value(n);
}
}
}
void QF3()
{
bool F;
double n;
if(T[0]>=T[3])
{
if(T[1]>=T[3])
{
if(T[2]>=T[1])
{
Ts=T[2];
n=100*q[2]*(1-Q)*(1-Q);
NB(n);
NC(n);
NS3(n);
Value(n);
}
else
{
Ts=T[1];
n=100*q[2]*(1-Q)*(1-Q);
NB(n);
NC(n);
NS3(n);
Value(n);
}
Ts=T[1];
n=100*q[2]*(1-Q)*Q;
NB(n);
NS3(n);
NQ(n);
Value(n);
}
else
{
if(T[2]>=T[3])
{
Ts=T[2];
n=100*q[2]*(1-Q)*(1-Q);
NB(n);
NC(n);
NS3(n);
Value(n);
}
else
{
Ts=T[3];
n=100*q[2]*(1-Q)*(1-Q);
NB(n);
NC(n);
NS3(n);
Value(n);
}
Ts=T[3];
n=100*q[2]*(1-Q)*Q;
NB(n);
NS3(n);
NQ(n);
Value(n);
}
Ts=T[3];
n=100*q[2]*Q;
NS3(n);
NQ(n);
Value(n);
}
else
{
if(T[1]>=T[3])
{
if(T[2]>=T[3])
{
Ts=T[2];
n=100*q[2]*(1-Q);
NA(n);
NC(n);
NS3(n);
Value(n);
}
else
{
Ts=T[3];
n=100*q[2]*(1-Q);
NA(n);
NC(n);
NS3(n);
Value(n);
}
Ts=T[3];
n=100*q[2]*Q;
NA(n);
NS3(n);
NQ(n);
Value(n);
}
else
{
if(T[2]>=T[3])
{
Ts=T[3];
n=100*q[2];
NA(n);
NB(n);
NS3(n);
Value(n);
}
else
{
Ts=max(max(T[0],T[1]),T[2]);
n=100*q[2];
NA(n);
NB(n);
NC(n);
Value(n);
}
}
}
}
void Reliability()
{
double F[Nm];
double p[Nm];
int i;
for(i=0;i<Nm;i++)
{
F[i]=0;
}
for(i=0;i<Nm;i++)
{
p[i]=double(Ndt[i])/(100*N); //系统失效概率分布
if(i==0) //计算不可靠度
{
F[i]=p[i];
}
else
{
F[i]=F[i-1]+p[i];
}
R[i]=1-F[i]; //计算可靠度
}
MTBF=0;
for(i=0;i<Nm;i++)//取各段中点计算MTBF
{
MTBF=MTBF+(i+0.5)*dT*p[i];
}
for(i=0;i<=6;i++)
{
Wn[i]=Nc[i]/(100*N);
}
Wn[7]=Wn[6];
Wn[6]=Wn[3]+Wn[4]+Wn[5];
}
void OutPut()
{
int i;
cout<<setiosflags(ios::fixed)<<setprecision(4);
cout<<"可靠度:"<<endl;
for(i=0;i<Nm;i++)
{
cout<<R[i]<<" ";
}
cout<<endl;
cout<<"MTBF:"<<MTBF<<endl<<endl;
cout<<"模式重要度:"<<endl;
cout<<"A B C S1 S2 S3 S Q"<<endl;
for(i=0;i<=7;i++)
{
cout<<Wn[i]<<" ";
}
cout<<endl<<endl;
}
int main()
{
int i;
RN=0;
seed=7733;
for(i=0;i<=2;i++)
{
T[i]=0;
}
for(i=0;i<=6;i++)
{
Nc[0]=0;
}
for(i=0;i<N;i++)
{
Tinit();
QF1();
QF2();
QF3();
}
Reliability();
OutPut();
}