R中的制服比例分布

时间:2016-11-13 12:32:23

标签: r

我有一个练习,我必须按如下方式创建算法:

制服的比率基于以下事实:对于具有密度f(x)的随机变量X,我们可以通过计算一对(U,V)中均匀分布的X = U / V来从期望的密度生成X.设置

Af = {(u,v):0 < v ≤  f(u/v)}

可以通过从最小边界矩形(即包含Af的最小可能矩形)的拒绝在Af中均匀地采样随机点。  它由(u-,u +)×(0,v +)其中

给出
v+ = max f(x), x

u− = minx f(x), x

u+ = maxx f(x)

然后,制服比率方法包括以下简单步骤:

  1. 在(u-,u +)中统一生成随机数U。

  2. 在(0,v +)中统一生成随机数V.

  3. 设置X←U / V.

  4. 如果V2≤f(X)接受并返回X。

  5. 请再试一次。

  6. 到目前为止我的代码:

    x <- cnorm(1, mean = 0, sd=1)
    
    myrnorm <- function(pdf){
         ## call rou() n times
         pdf <- function(x) {exp(-x^2/2)}
         }
    rou <- function(u, v) {
       uplus <- 1
       vplus <- 1
       n <- 100
       u <- runif(n, min=0, max=uplus)
       v <- runif(n, min=0, max=vplus)
       xi <- v/u
       while(v < sqrt(xi)) {
         if(v^2 <= xi)
           return(xi)
         }
    }
    
    
    myx <- myrnorm(1000)
    hist(myx)
    

    但我真的不知道该怎么做。我很喜欢这个练习。我真的很感激任何建议。

1 个答案:

答案 0 :(得分:0)

按照本link第8页的示例1和您的示例代码,我提出了这个解决方案:

#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
#pragma include "cachelab.h"

typedef struct lines{
    short int valid;
    long long int tag;
    char block;
    int last, n_accesses;
} line;

typedef struct sets{
    line *set_line;
} set;

typedef struct caches{
    set *cache_set;
} cache;

typedef struct cache_evaluations{
    int hits, misses, evictions;
} evaluation;

typedef struct data_reads{
    int s, E, b, n_sets, n_lines;
} data;

void create_cache(cache c_cache, data r_data){

    set c_set;
    line c_line;
    int n_sets = r_data.n_sets;
    int n_lines = r_data.n_lines;
    int set_i, line_j;

    c_cache.cache_set = malloc(sizeof(set) * n_sets);
    if (!c_cache.cache_set) fprintf( stderr, "OMG1!\n");

    for(set_i = 0; set_i < n_sets; set_i++){

        c_set.set_line = malloc(sizeof(line) * n_lines);
        if (!c_set.set_line) fprintf( stderr, "OMG2!\n");

        c_cache.cache_set[set_i] = c_set;

        for(line_j = 0; line_j < n_lines; line_j++){
            c_line.valid = 0;
            c_line.tag = 0;
            c_line.n_accesses = 0;
            c_line.last = 0;
            c_set.set_line[line_j] = c_line;
        }
    }
}

int main(int argc, char **argv){

    data r_data = {0};
    cache c_cache = {NULL};

    r_data.n_sets = 8;
    r_data.n_lines = 4;
    create_cache(c_cache, r_data);
    fprintf( stderr, " c_cache.cache_set = %p\n", (void*) c_cache.cache_set );
    if ( !c_cache.cache_set) fprintf( stderr, "OMG3!\n" );

    return 0;
}

许多代码可能已经过优化,但我认为这样就足够了。我希望这会有所帮助。