楼主: 天狮
16930 11

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

  • 1关注
  • 10粉丝

已卖:3425份资源

教授

34%

还不是VIP/贵宾

-

威望
1
论坛币
6260 个
通用积分
354.9819
学术水平
20 点
热心指数
35 点
信用等级
13 点
经验
18386 点
帖子
1396
精华
0
在线时间
533 小时
注册时间
2008-10-10
最后登录
2025-9-4

楼主
天狮 发表于 2011-5-22 19:12:28 |AI写论文
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 离散 随机数

沙发
qoiqpwqr 发表于 2011-5-22 19:12:29
drnd <- function(x, p, n) {
    z <- NULL
    ps <- cumsum(p)
    r <- runif(n)
    for (i in 1:n) z <- c(z, x[which(r[i] <= ps)[1]])
    return(z)
}
> x <- c(1, 2, 3, 4, 5)
> p <- c(0.1, 0.2, 0.2, 0.35, 0.15)
> out <- drnd(x, p, 10000)
> table(out)/10000
out
     1      2      3      4      5
0.0978 0.2056 0.1974 0.3480 0.1512

缺点:慢,因为那个for循环
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
AspenRd + 1 + 1 + 1 鼓励积极发帖讨论

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
天狮 发表于 2011-5-24 15:00:44
等了两天了,你写的还不错,那分就给你吧,是不是我点最佳答案就可以了?
还有两个小问题,z <- c(z, x[which(r[i] <= ps)[1]])是什么意思,不是有两边吗,r[i]还要大于某某呀;
另外你最后搞个table(out)/10000是什么意思

板凳
天狮 发表于 2011-5-24 15:02:20
哦,忘了说谢谢了

报纸
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 23:05:10
MUCHAS GRACIAS !

7
qoiqpwqr 发表于 2011-5-25 04:52:54
De Nada  !

8
一诺9257 发表于 2011-5-25 08:20:58
统计模拟,你可以参见武汉大学出版社《统计模拟及其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}

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

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-23 13:25