有正整數1~10,出現的概率分布給定,如何利用MATLAB按照各數字出現的概率輸出一個數字?

有正整數1~10,MATLAB程序如何編寫能夠實現:輸出的數字嚴格按照給定的概率分布。

假如1~10出現的概率分布是25%,20%,15%,15%,10%,5%,3%,3%,2%,2%

如何保證輸出1的概率是25%?


@Falccm已經給出了MATLAB的幾種解決方案,這裡再給出類似的Python實現。

  • 從最簡單的構造樣本出發,給出一個具有特定概率分布的樣本,然後從中隨機抽樣。Python的numpy模塊具有構造重複數組元素的函數repeat,與Matlab中的repelem函數對應。具體實現如下:

import numpy as np
import matplotlib.pyplot as plt

sample_list = np.repeat(range(1, 11), [25, 20, 15, 15, 10, 5, 3, 3, 2, 2])
sample_result = sample_list[np.random.randint(0, 100, int(1e6))]

#------------&>&>&> 以下為可視化部分,可以忽略 &<&<&<------------- plt.style.use("ggplot") ax = plt.subplot(111) ax.hist(sample_result, bins=10, normed=True, color="r", alpha=.75) ax.set_title("The histogram of sampling results with a specified probability distribution", fontname="Arial", fontweight="bold", fontsize=16) ax.set_xticklabels(ax.get_xticks(), fontname="Arial", fontsize=12) ax.set_yticklabels(ax.get_yticks(), fontname="Arial", fontsize=12) plt.show()

  • 對應於Matlab的randsrc按照指定概率抽樣也是可以實現的,numpy(1.7.0版本以後)中的choice函數實現類似的功能:

    sample_list = np.arange(1, 11)
    prob = 0.01*np.array([25, 20, 15, 15, 10, 5, 3, 3, 2, 2])
    sample_result = np.random.choice(sample_list, int(1e6), p=prob)


如果你的版本是r2015a或更新版本,可以直接用discretize函數:

sz = [1e7,1]; % 輸出隨機矩陣的size
p = [25 20 15 15 10 5 3 3 2 2]/100;
r = discretize(rand(sz),[0 cumsum(p)]);

如果老版本沒有discretize函數的話還可以用histc實現:

[~,r] = histc(rand(sz),[0 cumsum(p)]);

或者建立一個數組採樣:

r = repelem(1:10,p*100)"; % 這裡要保證p*100為整數
r = r(randi(numel(r),sz));

但是這裡的repelem也是R2015a才有的(雖然可以自己實現但是也要好幾行),所以如果你能用這種方法還不如直接discretize

還有一種疊加邏輯值的方法不算很方便就不說了

另外如果你有Communications System Toolbox,也可以用randsrc函數;統計工具箱里也有類似的函數可以實現,不過我個人對於能用MATLAB簡單實現的過程不太喜歡用工具箱函數,你想用可以用用看

如果想驗證畫圖的話,直接

histogram(r,0.5:10.5)

或者(老版本沒有histogram):

hist(r,1:10)


這個容易,幾行代碼就能搞定:

function z=fun(n,p)
p=[0 p(:)"];
N=length(p);
p=ones(n,N)*diag(p*triu(ones(N)));
r=diag(rand(n,1))*ones(n,N);
z=sum(r&>p,2);
end

寫個驗證的小程序:

p=[25,20,15,15,10,5,3,3,2,2]/100;
z=fun(1000,p);
s=zeros(length(p),1);
for i=1:length(p)
s(i)=sum(z==i);
end
s=s/1000;

畫個圖:

效果還是相當湊合的。但是這樣搞有個毛病,就是比較費內存。


matlab具體怎麼弄不知道。不過寫個程序,直接取標準的0~1的均勻隨機數,然後如果這個數小於0.25就輸出1,大於0.25小於0.25+0.2=0.45就輸出2,大於0,45小於0.25+0.2+0.15=0.6就輸出3,以此類推就好了。


推薦閱讀:

Matlab計算逆序數出現問題?
有沒有地理信息可視化的繪圖軟體?
固定效應 隨機效應 組內估計量 組間估計量 GLS的關係?
從平面圖表中提取數據的軟體?
Python對比Matlab,有什麼決定性的優勢?

TAG:Python | 數學 | MATLAB | 概率論 |