-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

一种(非高效,但在数学上很漂亮的 IMO)方法是:

对于每个人(重复 15M 次),选择均匀分布的城市。

它将在所有城市中为您提供 1500 万人的总数,并且根据中心极限定理- 您将在每个城市中接近正态分布,因为每个城市基本上是伯努利试验的总和p=1/3000,超过 1500 万次试验。

于 2013-10-15T09:10:20.837 回答
0

一个方法的粗略草图:

  • 使用 Random#nextGaussian() 为每个城市创建一个介于 0-1 之间的值 X。
  • 计算所有这些 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 回答