此代码在 [0,1) 范围内生成 50 个随机数。
int main(){
int i,j,M=50;
// If the interval is not uniform
double interval_widths[3] = { 0.1, 0.11, 0.03};
double interval_widths_sum[3];
//Divide into subintervals
void Init() {
interval_widths_sum[0] = 0;
for (int i=1; i<N; i++) {
interval_widths_sum[i] = interval_widths_sum[i-1] + interval_widths[i];
}
}
//check in which interval R is
int Seek(double R) {
int i;
if (R < 0.0) return -1;
for (i = 0; i < N; i++) {
if (R >= interval_widths_sum[i]) {
break;
}
return (i);
}
}
unsigned long init[4] = {0x123, 0x234, 0x345, 0x456}, length = 4;
MTRand drand;
for (i = 0; i < M; i++) {
double x=("%10.8f ", drand());
double y=("%10.8f ", drand());
double R=("%10.8f ", drand());
cout<<"(x,y)="<< x <<","<< y<< endl;
a[i]=x*y;
double *p= &x;
double *q= &y;
double *r= &R;
double z= Seek(*r);
cout<<"(x,y)="<<*p<<","<<*q<<endl;
cout<< Init<<" "<< z<<endl;
}
}
1) 在 [0,1] 范围内生成 x 和 y 的值。假设 x= 0.11, 0.23, ... 和 y= 0.13, 0.33, ... 等;
2) 现在定义 a= x*y。比如 a1= 0.11*0.13, a2 = 0.23*0.33 等等。
3) 现在我想将区间 [0,1] 细分为 (3j-2) 大小为 [0,a1],[a1,a1+a2],......,[ai,1] 的子区间(i=1...3j-3)。
4) 然后生成[0,1]范围内的数R。并检查 (3j-2) 中的哪一个包含这个 R。