2013-11-09 15 views
9

初めてここでStackoverflow。誰かがアルゴリズムの検索で私を助けてくれることを願っています。与えられた範囲でN個の乱数を生成し、合計の合計を計算する

指定された範囲でN個の乱数を生成する必要があります。例えば

:11

範囲にまとめるGeneratare 3つの番号:3 5〜8

  • 値と1と3
  • 値と

    1. 値及び7.

    このサンプルの生成番号は、2、5、4です。

    私はすでにたくさんの検索をして、私が必要とする解決法を見つけることができませんでした。 generate random numbers of which the sum is constant しかし、私はそれは範囲で成し遂げるcouldntの:

    このような一定の合計unsing剰余のN番号などを生成することが可能です。

    またはN個の乱数を生成してそれらを合計し、次に乱数で定数和を除算した後、各乱数にその商であるas proposed hereを掛けます。

    主な問題は、私のランダムな値にはそれぞれ異なる範囲があり、範囲に均等に分散される値が必要であるということです(これらの値は最小/最大で発生しません。 min/maxより小さい/大きい値をカットオフ)。

    私はまた、乱数(その例では値1,2または3)をとり、その範囲内の値を生成します(min/maxまたはminと残りの合計私の与えられた合計の数を引くこと、そしてすべてが分配されるまでそれを保つこと。しかし、それはひどく非効率的です。アルゴリズムの実行時間が固定される方法を実際に使用することができます。

    私はJavaで実行しようとしています。しかし、誰かが既に解決策を用意している場合を除いて、Infoはそのimportendではありません。私が必要とするのは、アルゴリズムの記述かアイデアです。

  • +2

    不可能です。彼らがあなたの要件を満たしていれば、彼らは本当にランダムではありません。 –

    +3

    @HotLicks - 私は不規則であるかもしれません。乱数を生成することはできませんが、必要な無作為数の自由度は低いです。私はこの主張が「範囲[0,10]の乱数を生成することができない - 本当のランダム化が不可能になるため」と同じであることがわかります。 – amit

    +0

    @amit - 最初の2つの数字を選んだら、3番目の数字はランダムではありません。 –

    答えて

    7

    まず、問題と等価であることに注意:

    数yに合計k個の番号、X_1、...、X_Kように生成 - 各々は限界があります。

    第二は、単に数の下限を低減することによって達成することができます - ので、あなたの例では、と等価である:

    例えばX1 = 2 <その3つの数字を生成します。 x2 < = 3; x3 < = 4;第二の問題は、さまざまな方法で解決することができることを、X1 + X2 + X3 = 2

    注、そのうちの一つは、次のとおりです。

    は、要素ごとに​​リピートを有するリストを生成 -​​要素の限界でありますi - リストをシャッフルし、最初の要素を選択します。

    例では、リストは[x1,x1,x2,x2,x2,x3,x3,x3,x3]です。シャッフルして最初の2つの要素を選択します。

    (*)fisher-yatesアルゴリズムを使用してリストをシャッフルすることができます。 (目的の限界を過ぎた後で途中でアルゴリズムを中止することができます)。

    +0

    正確に何が必要なのです、ありがとう。複雑なものについては、Kが大きく、範囲が広い(例えば、50-150など)とリストのメモリ消費量を考慮する必要があります。 – user2971974

    +0

    必ずしもリストを作成する必要はありません。ほんの数のサンプルが必要な場合は、シャッフルせずに仮想リストを使用できます。無作為にその位置を選択すると、要素を得ることができます(カウントダウン、マークされた要素をスキップしますなど) –

    +0

    これがどのように動作するかを理解するには数年かかりましたが、今では、これは –

    6

    最小値を追加してください。この場合、1 + 5 + 3 = 9

    11 - 9 = 2の3つの数字の間に2を配分する必要があります(例:+ 2、+ 0、+ 0または+ 0、+ 1、+ 1 )。

    私はあなたのために残りますが、この変換後に一様分布を作成するのは比較的簡単です。

    +1

    これはこれを行う方法ですが、私が望むやり方ではありません。あるいは、より具体的には、問題自体はここでのポイントの分布です。しかし、申し訳ありませんが、その私のせい(悪い例や悪い問題の説明)。 他の範囲の別の例では、 ,1-2-220- -3,1-,3合計で、例えば15とすると、値1および2はほとんどの場合最大値に達する。これは私が望んでいたものではありません。 amits解決策は私の心の中にあったものです。ポイントは、範囲の大きさに応じて、ウェイトで配分する必要があります – user2971974

    2

    この問題は、3ポジションで、少なくとも935以上の超過分をランダムに分配することに相当します。

    最小値(1/5/3)から始めて、2回を繰り返し、[0-2](3位)の(疑似)ランダム値を生成し、インデックス値をインクリメントします。

    • スタート1/5/3
    • 第一ランダム= 1 ...インクリメントインデックス1 ... 1/6/3
    • 第二ランダム= 0 ...インクリメントインデックス0 ... 2この第二の読み取り時間+ 3 = 11

      編集

      /6/3

    2 + 6、私は理解し、これはEであります@KarolyHorvathが何を言いましたか?

    関連する問題