我试过用C++编写了一个函数,但是效果仍然不理想,应该是反复生成大量随机数,又要重复分配内存空间造成的耗时,于是我想到用完全的R语言的向量化的思维来达到同样的效果:
- y1 <- matrix(rnorm(1e4 * 1e4, 0, 1), 1e4)
- y2 <- matrix(rnorm(1e4 * 1e4, 0.2, 1), 1e4)
- for (N in 1e3:1e4) {
- y1mean <- colMeans(y1[1:N, ])
- y2mean <- colMeans(y2[1:N, ])
- result <- abs(y1mean - y2mean) < 0.23
- if (sum(result) / 1e4 > 0.8) break
- }
- N
复制代码返回值的概率分布的期望和方差应该与你的代码返回值的期望和方差是一致的。
另,以下C++版的循环仅作为我自己备查之用:
- library(Rcpp)
- cppFunction('int calN(int numSample, int begin, int end) {
- double Meany1 = 0;
- double Meany2 = 0;
- int N;
- for(N = begin; N < end; N++) {
- NumericVector y1(N);
- NumericVector y2(N);
- int aa = 0;
- for(int i = 0; i < numSample; i++) {
- y1 = rnorm(N, 0, 1);
- y2 = rnorm(N, 0.2, 1);
- Meany1 = mean(y1);
- Meany2 = mean(y2);
- if((Meany2 - Meany1) < 0.23 && (Meany2 - Meany1) > -0.23)
- aa = aa + 1;
- }
- if(aa > (0.8 * numSample))
- break;
- }
- return N;
- }')
- calN(10000, 1000, 10000)
复制代码