2012-03-21 82 views
4

我需要生成具有以下屬性的隨機數。在Matlab中用最大,最小和平均值(平均值)生成一個隨機數

  • min必須1
  • MAX必須9
  • 平均(平均)爲6.00(或別的東西)
  • 隨機數必須是整數(正)只

我已嘗試過幾種語法,但沒有任何效果,例如

r=1+8.*rand(100,1); 

這給我一個介於1-9之間的隨機數,但它不是一個整數(例如5.607或4.391),每次我計算它的平均值就會變化。

+3

你想爲你的分佈是什麼形狀? – Jonas 2012-03-21 15:48:04

+0

對於任何RNG,不要指望平均值將始終與您指定的完全相同,它會因運行而異。更大的N可以更接近。 – yuk 2012-03-21 17:44:33

+0

分佈的類型並不重要,只要每個隨機數的集合都是相同的。 – Chanon 2012-03-22 02:02:58

回答

2

這裏是一個循環的算法,以達到所需的平均xmean(與要求的精度xeps)通過從載體的二分之一到另一個根據再生一個隨機數意味着在當前迭代。通過我的測試,它達到了相當快的速度。

n = 100; 
xmean = 6; 
xmin = 1; 
xmax = 9; 
xeps = 0.01; 
x = randi([xmin xmax],n,1); 
while abs(xmean - mean(x)) >= xeps 
    if xmean > mean(x) 
     x(find(x < xmean,1)) = randi([xmean xmax]); 
    elseif xmean < mean(x) 
     x(find(x > xmean,1)) = randi([xmin xmean]); 
    end 
end 

x是您需要的輸出。

+0

這個語法給我--- ???未定義的函數或方法'randi'用於'double'類型的輸入參數.---- T-T幫我解答。 – Chanon 2012-03-22 02:09:50

+0

函數'randi'(產生隨機整數)在MATLAB版本2008b中首次出現。可能你的年齡更大。看到這[SO回答](http://stackoverflow.com/questions/6415424/using-rand-in-matlab-to-produce-numbers-between-limits/6415698#6415698)。 – yuk 2012-03-22 03:10:09

+0

好吧,現在我明白了,因爲我正在運行MATLAB 2008a TT – Chanon 2012-03-22 04:59:01

1

你可以使用floor截斷你的隨機數只整數值:

r = 1 + floor(9 * rand(100,1)); 

獲得規定的平均有點麻煩;這取決於你之後的發行方式。

+0

任何一種分配都可以,每一個產生的意思都是一樣的。 – Chanon 2012-03-22 02:21:53

4

您可以根據Matlab的randi函數定義滿足您要求的函數。但要小心,很容易定義不產生隨機數的隨機數發生器的函數。

另一種方法可能適用 - 創建概率分佈以滿足您的要求。在這種情況下,您需要一個9個浮點數的向量,其總和爲1,並且它們分別表示出現第i個整數的概率。例如,分佈可能是由以下矢量來描述:

[0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1] 

這些分割區間[0,1]到9份。然後,將您最喜歡的rng生成範圍[0,1)內的浮點數並生成一個數字,假設它是0.45。沿着從0到1的間隔讀取,你發現這是第5個間隔,所以返回整數5.

顯然,我一直懶得給你一個給出6作爲平均值的向量的分佈,但這對你來說不應該太難。

2

您可以使用randi獲得隨機整數

1

在設計隨機數發生器之前,您需要指定它應該從中抽取的分佈。你只完成了一部分工作:即,你指定它從[1,9]中的整數中繪製,並且它具有你想要指定的意思。這仍然留下無限的分佈選擇。你想要你的發行還有什麼其他的屬性?

編輯下面的評論:任何來自概率分佈的有限樣本的平均值 - 所謂的樣本均值 - 只會接近分佈的均值。這是沒有辦法的。

話雖如此,最簡單的(在最大熵的意義上)域中分佈在整數[1,9]是指數分佈:即

p = @(n,x)(exp(-x*n)./sum(exp(-x*(1:9)))); 

參數x確定分配意思。相應的累積分佈是

c = cumsum(p(1:9,x)); 

要從分佈繪製p可以借鑑[0,1]的隨機數,發現它落在什麼c子區間:即

samp = arrayfun(@(y)find(y<c,1),rand(n,m)); 

將返回一個[n,m]p中抽取的整數數組。

+0

詢問任何類型的分佈是可以的,分佈的類型並不重要,只是想要每個隨機數的意思是相同的。謝謝。 – Chanon 2012-03-22 02:04:49

1

如果分佈並不重要,所有你感興趣的是平均值,然後有一個特別簡單的函數,它是:

function x=myrand 
x=6; 
end 
相關問題