2012-03-21 23 views
4

以下のプロパティを持つ乱数を生成する必要があります。 Minは1 Matlabで最大、最小、平均(平均)の乱数を生成

  • マックスは9
  • 平均(平均)6.00(または何か他のもの)である
  • 乱数がなければなりません整数(正)のみ
  • でなければなりませんしなければならない

    • Iいくつかの構文を試しましたが、何も動作しません。例えば、

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

      これは私に1から9の間の乱数を与えますが、整数ではありません(例えば5.607または4.391)。

    +3

    は、あなたのディストリビューションには何形状たいですか? – Jonas

    +0

    RNGについては、平均値が常に指定どおりになるとは思わないので、実行ごとに平均値が変化します。 Nが大きければ近いほど近づくことができます。 – yuk

    +0

    分布のタイプは重要ではない、ちょうど平均が乱数の各セットについて同じであることを望む。 – Chanon

    答えて

    2

    を取得するためにrandiを使用することができますによるベクターの半分から別の乱数を再生成することにより、必要な平均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

    この構文は私に---与える?未定義の関数またはメソッド 'double'の入力引数のための 'randi' .---- T-Tは私に助けます。 – Chanon

    +0

    関数 'randi'(ランダムな整数を生成する)は、MATLAB version 2008bで最初に登場しました。おそらく、あなたは年をとっています。これを参照してください[SO答え](http://stackoverflow.com/questions/6415424/using-rand-in-matlab-to-produce-numbers-between-limits/6415698#6415698)。 – yuk

    +0

    私はMATLAB 2008a TTを実行しているので、今私はそれを持っています。 – Chanon

    1

    あなたは整数値のみにあなたの乱数を切り捨てるfloorを使用することができます。

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

    指定された平均値を取得するには少しトリッキーです。それはあなたがどのような分布をしているかによって異なります。

    +0

    どのような種類の分布も大丈夫です。生成するたびに同じ意味になります。 – Chanon

    4

    Matlabのrandi関数に基づいて要件を満たす関数を定義できます。しかし、乱数を生成しない乱数生成器の関数を定義することは容易であることに注意してください。

    別の方法が適しています - 要件を満たす確率分布を作成する。この場合、合計が1になり、i番目の整数が出現する確率を個々に表す9個の浮動小数点数のベクトルが必要です。たとえば、次のベクトルでディストリビューションを記述することができます。

    [0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1] 
    

    これらは、[0,1]を9つの部分に分割します。次に、[0,1]の範囲の浮動小数点数を生成し、数値を生成するあなたの好きなrngをとります。これは0.45です。 0から1までの間隔に沿って読むと、これは5番目の間隔にあることが分かります。したがって、整数5を返します。

    明らかに、平均を6にするベクトルを与えるのはあまりにも怠惰ですあなたが把握するのはあまり難しいことではありません。

    2

    あなたはここで、ランダムな整数に

    1

    乱数ジェネレータを設計する前に、それを描画する分布を指定する必要があります。あなたは部分的にしか行いませんでした。つまり、あなたは[1,9]の整数から描画を指定しました。指定できるようにしたいという意味があります。それでも、無数の配布物が選択されています。あなたのディストリビューションには他にどのようなプロパティがありますか?

    以下のコメントを編集してください:確率分布からの有限サンプルの平均 - いわゆるサンプル平均 - は分布の平均に近似します。その周りに方法はありません。

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

    パラメータxは分布を決定する、すなわち:言われたことは

    、ドメイン内の整数にわたって分布(最大エントロピー意味で)最も単純には、[1,9]は指数分布であります平均。すなわち、

    samp = arrayfun(@(y)find(y<c,1),rand(n,m)); 
    
    :対応する累積分布を使用すると、[0,1]から乱数を描き、それがに落ちる cのどのサブ間隔を見つけることができます p分布から描画すること

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

    です

    は、pから引き出された[n,m]の整数の配列を返します。

    +0

    にお尋ねすることをお勧めします。任意の種類の分布は大丈夫です。分布の種類は重要ではなく、乱数の各集合について平均が同じであることが望ましいです。ありがとう。 – Chanon

    1

    分布は重要ではなく、あなたが興味を持っているすべてが平均である場合、その行いは特に簡単な関数があります:

    function x=myrand 
    x=6; 
    end 
    
    関連する問題