Transformation方法的概述如下:设$F(x)$为随机变量$x$的累积分布函数,如果我们取$y=F(x),F(x)\in [0,1]$作为一个新的随机变量,那么$\frac{\text{d}y}{\text{d}x}=F’(x)=f(x)$,所以随机变量$y$所满足的pdf(probability density function)函数为
/*定义multiplier和modulus*/ #define M 4294967296 // 2^32 #define A 1664525 #define C 1013904223 #define PI 3.14159265358979323846
/*定义整数和浮点数两种顺序表*/ structintseq { int MAXNUM; unsignedint* element; }; typedefstructintseq* Pintseq; structfloatseq { int MAXNUM; float* element; }; typedefstructfloatseq* Pfloatseq;
/*建立空表*/ Pintseq createintseq(int m) { Pintseq pis = (Pintseq)malloc(sizeof(struct intseq)); if (pis != NULL) { pis->element = (unsignedint*)malloc(sizeof(unsignedint) * m); if (pis->element) { pis->MAXNUM = m; return pis; } elsefree(pis); } printf("Out of space!"); returnNULL; } Pfloatseq createfloatseq(int m) { Pfloatseq pfs = (Pfloatseq)malloc(sizeof(struct floatseq)); if (pfs != NULL) { pfs->element = (float*)malloc(sizeof(float) * m); if (pfs->element) { pfs->MAXNUM = m; return pfs; } elsefree(pfs); } printf("Out of space!"); returnNULL; }
/*新建随机数(原始整数)顺序表,并返回指针*/ Pintseq Random(int size, unsigned see) { int i; unsignedint seed; if (see == 0) { seed = (unsigned)time(NULL); } else { seed = (unsigned)time(NULL); seed = seed * see; } Pintseq pis = createintseq(size); pis->element[0] = (A * seed + C) % M; for (i = 1; i < pis->MAXNUM; i++) { pis->element[i] = (A * pis->element[i - 1] + C) % M; } return pis; }
/*输出(打印至屏幕)*/ voidprintintseq(Pintseq pis) { int i; for (i = 0; i < pis->MAXNUM; i++) { printf("%d\n", pis->element[i]); } return; } voidprintfloatseq(Pfloatseq pfs) { int i; for (i = 0; i < pfs->MAXNUM; i++) { printf("%f\n", pfs->element[i]); } return; }
/*单位化原始随机数*/ Pfloatseq unifying(Pintseq pis) { Pfloatseq pfs = createfloatseq(pis->MAXNUM); int i; for (i = 0; i < pfs->MAXNUM; i++) { pfs->element[i] = (float)pis->element[i] / M; } return pfs; }
/*对随机数进行transform*/ voidtransform(Pfloatseq pfs) { int i; for (i = 0; i < pfs->MAXNUM; i++) { pfs->element[i] = -log(pfs->element[i]); } return; }
/*对随机数进行区间的平移和伸缩变换*/ voidmoveandscale(Pfloatseq pfs, float xmin, float xmax) { int i; for (i = 0; i < pfs->MAXNUM; i++) { pfs->element[i] = xmin + pfs->element[i] * (xmax - xmin); } return; }
/*进行acceptance-rejection筛选,并输出结果*/ voidacceptance_rejection(Pfloatseq pxs, Pfloatseq pus) { int i; float x, fxi; for (i = 0; i < pxs->MAXNUM; i++) { /*在这里指定f(x)的具体形式*/ x = pxs->element[i]; fxi = 4 / sqrt(PI) * exp(-pow(x, 2)) * pow(x, 2);