2013-02-19 14 views
7

私はランダムに4の値を12の異なる変数に分割するスクリプトを作成しようとしています。私はこれを適切に行う良い方法を考えることができません。私は0.33(4分の1の12)に近づくように数字をランダム化することを考えましたが、それはしばしば最後のいくつかの数字が過小優先順位になることにつながります。誰もこれの前にこのようなことをしようとしたか、これをできるだけランダムで均一に不均一にするための素晴らしいアイデアがありますか?数値をランダムな不等号に分割する

答えて

17

好きな乱数ジェネレータから12個の乱数を生成する場合は、r1..r12とします。

これらをすべて追加します。合計額はsumです。

4の最初のランダム分数は(r1/sum)*4です。残りは明白でなければなりません。

+0

これは素晴らしかった!どうもありがとう! – Tom

+0

このソリューションでは、論理的に一様に分布する数値の集合は生成されませんが、本当に均一なものを生成できない理由を理解していないため、ほとんどの人が選択するようなソリューションです。 –

+0

@ woodchips:この批判の正体を示すのは役に立ちましたが(それは正しいが)、一様に分散したパーティションを生成する答えを提供することがさらに役立つだろう。私は後者をやろうとしましたが、それも正しいとは確信していません。 – rici

8

1より大きい任意の乱数を生成し、必要な合計に再スケーリングした後に生成します。

例:

  • 必要な合計:4
  • 乱数:1 2 3 4 5 6 7 8 9 10 11 12
  • 合計= 78の
  • 再スケーリング番号:

1が(1 * 4)/ 78に再スケーリングされたもの

2に再スケーリング(2 * 4)/ 78

...

12(12 * 4)/ 78

2

以下のアルゴリズムに再スケーリングが可能であると仮定すると、均一に分布パーティションを提供連続的な範囲にわたって(または、少なくとも、複製のオッズが無視できるほど十分に多くの可能な値を有する離散的な範囲にわたって)均一に分布した乱数を生成することができる。範囲[0, t]k-1均一に分布値を生成

  • k値にtのパーティションを生成する

  • これらを並べ替え、先頭に0、最後にtを追加します。

  • 隣接する差分をパーティションとして使用します。

関連する問題