楼主: 天狮
15904 11

[有偿编程] 如何用R生成服从任意有限离散分布的随机数 [推广有奖]

  • 1关注
  • 10粉丝

教授

33%

还不是VIP/贵宾

-

威望
1
论坛币
6271 个
通用积分
352.8722
学术水平
20 点
热心指数
35 点
信用等级
13 点
经验
18416 点
帖子
1406
精华
0
在线时间
510 小时
注册时间
2008-10-10
最后登录
2024-5-11

5论坛币
我在网上找到了如何用matlab生成服从任意有限离散分布的随机数的方法,代码如下:
function out=drnd(p,n)
%out=drnd(p,n)
%copyright:rocwoods
%p is the probability distribution matrix;
%n is the number of the samples you want to generate;
%=================
a=cumsum(p(2,: ));
b=rand(n,1);
out=zeros(1,n);
for k=1:n
c=find(a<b(k));
if (isempty(c))
out(k)=p(1,1);
else
out(k)=p(1,c(end)+1);
end
end

举例说明:
比方说一个随机变量可以取1 2 3 4 5这5个值。每个值的概率分别为0.1 0.3 0.25 0.25 0.1
则P=[1 2 3 4 5;0.1 0.3 0.25 0.25 0.1]
生成1000个样本,如下:
out=drnd(P,1000)
%结果省略

当然在R中可以直接调用sample函数得到结果,但我尝试着编写Rcode编写相同的程序(因为个人觉得R和matlab有很多相似之处),
比如说X的分布律满足x=(x1,x2,.....,xk),相应概率为p=(p1,p2,....,pk),要生成n个满足所给分布律的随机数z,则先要生成n个(0,1)随机数,记为r,
当0<r[i]<=p1时,z[i]=x1; 当p1<r[i]<=p1+p2时,z[i]=x2;........  当pk<r[i]<=1时,z[i]=xk; 我编写了R程序,但是结果老是出错。
本人刚接触软件不久,希望高手赐教,悬赏不多,还请包涵。
关键词:如何用 随机数 distribution Probability Copyright 离散 随机数
12
小Q——旭旭 学生认证  发表于 2017-11-1 11:31:47 |只看作者 |坛友微信交流群
qoiqpwqr 发表于 2011-5-22 19:12
drnd
为什么我复制粘贴过去  代码有问题呢,求大神讲解

使用道具

11
402829154 发表于 2017-3-29 09:11:48 |只看作者 |坛友微信交流群
myfun2=function(n,x,prob)
#x=(x_1,x_2,...)
#n:sample size
#prob=(p_1,p_2,...)
  { result=rep(0,n)
    p=cumsum(prob)
   
    for(i in 1:n)
    {
      u=runif(1)
      kk=min(which(p-u>0))
      result[i]=x[kk]
    }
  
    return(result)
}

使用道具

10
jzdfenger 发表于 2015-10-18 00:02:18 |只看作者 |坛友微信交流群
一诺9257 发表于 2011-5-25 08:20
统计模拟,你可以参见武汉大学出版社《统计模拟及其R应用》,这本书挺好的
你说的是<<统计模拟与R实现>>吗?

使用道具

9
danica33 发表于 2014-3-19 16:08:11 |只看作者 |坛友微信交流群
f<-function(n,x,prob){
  num<-length(prob)
  u<-runif(n)
  cup<-cumsum(prob)
  z<-x[as.integer(cut(u,breaks=c(0,cup)))]
  z}

使用道具

8
一诺9257 发表于 2011-5-25 08:20:58 |只看作者 |坛友微信交流群
统计模拟,你可以参见武汉大学出版社《统计模拟及其R应用》,这本书挺好的

使用道具

7
qoiqpwqr 发表于 2011-5-25 04:52:54 |只看作者 |坛友微信交流群
De Nada  !

使用道具

地板
天狮 发表于 2011-5-24 23:05:10 |只看作者 |坛友微信交流群
MUCHAS GRACIAS !

使用道具

报纸
qoiqpwqr 发表于 2011-5-24 22:04:58 |只看作者 |坛友微信交流群
table(out)/10000是用来检查一下结果合理不
z <- c(z, x[which(r[i] <= ps)[1]])是找到离散的cdf里面第一个大于r[i]的数,然后z[i]就赋值为x里面这个位置的数。就是按照你帖子里的算法来的。

使用道具

板凳
天狮 发表于 2011-5-24 15:02:20 |只看作者 |坛友微信交流群
哦,忘了说谢谢了

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-18 05:00