我想生成N个随机点,其产品值为1。
我是这样用MATALB做的:
N_=10;
x1_=rand(1, N_);
p_=prod(x1_);
x_=x1_;
x_(end)=x1_(end)/p_;
prod(x_);
有简单的(其他方式)吗? P~ = 1时怎么办?
感谢。
答案 0 :(得分:3)
执行此操作的一种方法是使用log(1) = 0
和a*b = exp(log(a+b))
这一事实。
x = rand(N,1);
norm_log_x = log(x)-mean(log(x));
norm_x = exp(norm_log_x);
norm_x =
2.6058
2.7166
0.6396
1.3958
1.0874
1.5147
0.7660
0.1977
1.2618
0.5028
prod(norm_x)
ans =
1.0000
要获得其他1
的值,您可以执行以下操作:
P = 7;
norm_log_x = log(x)-mean(log(x))+log(P)/length(x);
norm_x = exp(norm_log_x);
prod(norm_x)
ans =
7.0000
答案 1 :(得分:1)
在您的情况下,最后一个号码具有不同的分布。假设您希望所有数字都具有相同的分布:
N_=10;
x1_=rand(1, N_);
p_=prod(x1_);
x_=x1_./(p_.^(1/N_))
答案 2 :(得分:1)
Lognormal distribution具有产品再次对数正态分布的属性。这也意味着,当你可以做最后一次"修复"并且不可能找到用于此"分配修整的数字"。
答案 3 :(得分:0)
我目前无法访问MATLAB,但您不能这样做。.
n = 10;
x_sum = 1;
x_rand = rand(x_sum, n);
x_rand = x_rand ./ sum(x_rand);
这种方式给出了一个随机列表,如果您不希望总和为1,则可以更改x_sum
。如果您想要统一分布或其他统一分布,则可以替换rand()
具有不同的内置功能。</ p>
编辑: 我会快速运行以再次检查我的代码是否正确。
sum(x_rand);