我有一个练习,我必须按如下方式创建算法:
制服的比率基于以下事实:对于具有密度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)
然后,制服比率方法包括以下简单步骤:
在(u-,u +)中统一生成随机数U。
在(0,v +)中统一生成随机数V.
设置X←U / V.
如果V2≤f(X)接受并返回X。
请再试一次。
到目前为止我的代码:
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)
但我真的不知道该怎么做。我很喜欢这个练习。我真的很感激任何建议。
答案 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;
}
许多代码可能已经过优化,但我认为这样就足够了。我希望这会有所帮助。