-2

私の仕事は、正規確率分布を使用して都市住民を生成することです。

都市の数、3000、人口 15 000 000

(JAVA)

    int people = 15000000;
    int[] arrayofcity = new int[3000]
    for (int i = 0; i < arrayofcity.length; i++) {
            //how to generate people to the towns of total
            //nextGaussian()??

    }

ご協力ありがとうございました

4

3 に答える 3

0

それを行う1つの(非効率的ですが、数学的に美しいIMO)方法は次のとおりです。

人ごとに (15M 回繰り返す)、一様分布で自分の都市を選択します。

すべての都市で合計 1,500 万人の人口が得られ、中心極限定理によれば、各都市は基本的に 1,500 万回以上のベルヌーイ試行の合計であるため、各都市の正規分布に近くなりますp=1/3000

于 2013-10-15T09:10:20.837 に答える
0

メソッドの大まかなスケッチ:

  • Random#nextGaussian() を使用して、各都市の値 X を 0 ~ 1 の間で作成します。
  • これらすべての X 値の合計を計算します。Sと呼んでください。
  • 各都市について、その値 X を取り、S で割ります。この結果に総人口 (15 000 000) を掛けます。これは、この都市に住んでいる人の数です。

丸めのために、これを実際に実装するのは難しいことに注意してください。そのため、総人口は希望の 15 000 000 をわずかに上回ったり下回ったりする可能性があるため、余分な人を追加/削除するには何らかの方法が必要になります。

于 2013-10-15T09:15:10.703 に答える
0

このようなことを試してください..分布は2つの値ごとに平均化/キャンセルされるため、あまり効率的ではありません。

int people = 15000000;
    int[] arrayofcity = new int[3000];
    int sharedSpread=people/3000;                 // sharedSpread= avg population
    for (int i = 0; i < arrayofcity.length; i++) {

        if(i%2!=0)
          arrayOfCity[i] = sharedSpread + (sharedSpread-arrayOfCity[i-1]);
        else
            {
             Random r = new Random();
             int val = Random.nextInt();
             arrayOfCity[i] = val%sharedSpread ;   

            }

    }

PS: これは正確なコードではありませんが、問題の対処方法を示すことができます。配布の頻度を変更できます。ここでは 2 の代わりに 4 に変更して、より良いランダム分布を得ることができます...

于 2013-10-15T09:25:25.303 に答える