24小时热门版块排行榜    

查看: 1612  |  回复: 8

ice_huya

金虫 (小有名气)

[求助] Matlab 按概率生成随机数的一个小问题 已有2人参与

问题如下:

已知A=[6 5 4 3 2 1], 各元素值对应的概率为P=[0.0049 0.0978 0.1559 0.2220 0.2617 0.1468]
想要生成n个(比如,n=100)服从上述概率的随机数。

通常的办法是用rand函数,但我的问题是,各个值的概率加起来并不是等于1,且概率并没有单调递增或递减,,而rand随机产生的是0~1之间的数,所以想请教大家,该怎么做?

先跪谢!
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ice_huya

金虫 (小有名气)

好像知道了 是用r=a+(b-a)*rand 吗?

还有一个问题,这样生产的随机数,是大致符合给定的概率的分布,而不是严格服从概率吧?每一次重新生成就会变

那是不是越多越准确些呢?比如生产1000个比100个更符合概率分布?
2楼2016-11-18 04:30:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mygt_hit

专家顾问 (职业作家)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
ice_huya: 金币+10, 有帮助, 非常感谢回复!有启发!! 2016-11-18 22:31:43
这属于生成离散分布随机数的问题。不知道MATLAB是否有直接生成离散分布随机数的函数,但有一个变通的办法,将[0,1]区间划分为[0.0049 0.0978 0.1559 0.2220 0.2617 0.1468] 6个区间。用MATLAB生成【0,1】上的均匀随机数,落在哪个区间,就取哪个区间对应的整数(即[6,5,4,3,2,1]其中之一)。

第二个问题:MATLAB生成的是伪随机数,不过一般使用足够了。生成的随机样本越多,对概率分布的描述越好,或者说样本分布更加接近总体分布。
知其然,知其所以然。
3楼2016-11-18 14:54:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ChuYanWu

金虫 (正式写手)

function Ans = superRand
p = [0.0049 0.0978 0.1559 0.222 0.2617 0.1468];
pz = sum( p );
Num = round( 1000000*p./pz );
Top = sum( Num );
div = cumsum(Num);
Case = randi( Top );
n = find( sign( Case - div )== -1 );
Ans = n(1);

发自小木虫Android客户端
4楼2016-11-19 02:46:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ChuYanWu

金虫 (正式写手)

clear;clc
p = zeros(1,100000);
for i = 1:100000
    p(i) = superRand;
end
sum( p==1 )/length(p)

发自小木虫Android客户端
5楼2016-11-19 02:46:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ChuYanWu

金虫 (正式写手)

引用回帖:
4楼: Originally posted by ChuYanWu at 2016-11-19 02:46:15
function Ans = superRand
p = ;
pz = sum( p );
Num = round( 1000000*p./pz );
Top = sum( Num );
div = cumsum(Num);
Case = randi( Top );
n = find( sign( Case - div )== -1 );
Ans = n(1);
...

按概率产生随机数

发自小木虫Android客户端
6楼2016-11-19 02:46:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ChuYanWu

金虫 (正式写手)

引用回帖:
5楼: Originally posted by ChuYanWu at 2016-11-19 02:46:33
clear;clc
p = zeros(1,100000);
for i = 1:100000
    p(i) = superRand;
end
sum( p==1 )/length(p)

验证

发自小木虫Android客户端
7楼2016-11-19 02:47:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ice_huya

金虫 (小有名气)

引用回帖:
7楼: Originally posted by ChuYanWu at 2016-11-19 02:47:02
验证
...

非常感谢!虽然我还没完全搞懂,我会花时间再研究一下你的方法,谢谢!!!!

再回个贴应助一下呗? 想给你发金币表示感谢呢呀
8楼2016-11-19 23:30:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小圆盾

铜虫 (小有名气)

【答案】应助回帖

A = [6 5 4 3 2 1];
P = [0.0049 0.0978 0.1559 0.2220 0.2617 0.1468];
[p, I] = sort(P, 'ascend');
m = length(I);
B = A;
for i = 1:m
    A(i) = B(I(i));
end
n = 100;
p = p./sum(p);
for i = 1:n
r = rand;
if r < p(1)
x(i) = A(1);
elseif r < p(2)
x(i) = A(2);
elseif r < p(3)
x(i) = A(3);
elseif r < p(4)
x(i) = A(4);
elseif r < p(5)
x(i) = A(5);
else
x(i) = A(6);
end
end
x
9楼2016-12-19 10:47:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 ice_huya 的主题更新
信息提示
请填处理意见