因此,我有发行版f(x) = (4-2x)/3,用于x in [0,1],以及其他地方的f(x) = 0。
我现在想要从这个分布中生成,比如说n=100个随机数。我试着遵循这示例,这是我自己的代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <math.h>
#include <stdlib.h>
//pdf(x) = 1 if x>1
// = 0 if x<0
// = 1/3*(4-2x) otherwise
int N = 10;
int var1(int argc, char **argv) {
int p = 0, i;
for (i = 0; i < N; i++) {
p = (double)(rand() % 100)/100; // Generates 100 numbers in [0,1]
if (p > 1)
printf("%d ", 0);
else if (p < 0)
printf("%d ", 0);
else
printf("%f ", p * (4-2*0.1)/3);
}
printf("...");
return 0;
}然而,我的输出只是零:
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 …我有两个问题:
0.1代替了0.1?我只是做了同样的事,但我不明白为什么。发布于 2018-10-11 18:30:25
首先,您没有返回您认为是的随机数的范围:
p = (double)(rand() % 100)/100;右手的大小会给你一个范围内的数字( 0.00,0.01,0.02 . 0.99 )。但是,将该值赋值给p,它的类型为int。小数部分被截断,因此赋值始终为0。
将p类型更改为double以存储适当的值。此外,如果您想要更大范围的随机值,请使用以下方法:
p = (double)rand() / RAND_MAX;至于这一点:
printf("%f ", p * (4-2*0.1)/3);与链接代码相比:
printf("%f ", p * 0.1 / 360);他们的代码并没有用0.1代替x。p和x是一样的,但是由于某种原因,他们增加了额外的0.1因子。
要想做f(x) = (4-2x)/3,您需要这样做:
printf("%f ", (4-2*p)/3);https://stackoverflow.com/questions/52766539
复制相似问题