| 查看: 1612 | 回复: 8 | ||||
[求助]
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之间的数,所以想请教大家,该怎么做? 先跪谢! |
» 猜你喜欢
计算机、0854电子信息(085401-058412)调剂
已经有4人回复
基金申报
已经有3人回复
国自然申请面上模板最新2026版出了吗?
已经有9人回复
溴的反应液脱色
已经有6人回复
纳米粒子粒径的测量
已经有7人回复
常年博士招收(双一流,工科)
已经有4人回复
推荐一本书
已经有10人回复
参与限项
已经有5人回复
有没有人能给点建议
已经有5人回复
假如你的研究生提出不合理要求
已经有12人回复
2楼2016-11-18 04:30:24
mygt_hit
专家顾问 (职业作家)
-

专家经验: +362 - 应助: 438 (硕士)
- 贵宾: 0.019
- 金币: 19571.1
- 散金: 5130
- 红花: 135
- 沙发: 3
- 帖子: 4938
- 在线: 990.5小时
- 虫号: 1489764
- 注册: 2011-11-13
- 性别: GG
- 专业: 结构工程
- 管辖: 土木建筑
【答案】应助回帖
★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
ice_huya: 金币+10, ★有帮助, 非常感谢回复!有启发!! 2016-11-18 22:31:43
感谢参与,应助指数 +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
ChuYanWu
金虫 (正式写手)
- 应助: 0 (幼儿园)
- 金币: 1235.8
- 散金: 113
- 帖子: 453
- 在线: 45.2小时
- 虫号: 4004466
- 注册: 2015-08-03
- 性别: GG
- 专业: 光谱技术
|
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
ChuYanWu
金虫 (正式写手)
- 应助: 0 (幼儿园)
- 金币: 1235.8
- 散金: 113
- 帖子: 453
- 在线: 45.2小时
- 虫号: 4004466
- 注册: 2015-08-03
- 性别: GG
- 专业: 光谱技术
|
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
ChuYanWu
金虫 (正式写手)
- 应助: 0 (幼儿园)
- 金币: 1235.8
- 散金: 113
- 帖子: 453
- 在线: 45.2小时
- 虫号: 4004466
- 注册: 2015-08-03
- 性别: GG
- 专业: 光谱技术
6楼2016-11-19 02:46:53
ChuYanWu
金虫 (正式写手)
- 应助: 0 (幼儿园)
- 金币: 1235.8
- 散金: 113
- 帖子: 453
- 在线: 45.2小时
- 虫号: 4004466
- 注册: 2015-08-03
- 性别: GG
- 专业: 光谱技术
7楼2016-11-19 02:47:02
8楼2016-11-19 23:30:31
【答案】应助回帖
|
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












回复此楼
