地球人口越来越多,终于达到了100亿了。还好,发现了一颗适合人类居住的星球。现在,需要派遣八十万个人先期进驻。如何选出这八十万的人呢?
算法描述:
1、有六个数 0 1 2 3 4 5,随机数为 4 2 2 1 0 0。
2、第一次从六个数里取随机数,为4,则将第4个数取出,变为0123*5,取出的数为 4
3、而后,将第5个数交换到第4个数的位置上,即数字变为 01235
4、第二次从五个数里取随机数,为2,则将第2个数取出,变为01*35,取出的数为 2
5、而后,将第4个数交换到第2个数的位置上,即数字变为 0153
6、第三次从四个数里取随机数,为2,则将第2个数取出,变为01*3,取出的数为 5
7、而后,将第3个数交换到第2个数的位置上,即数字变为 013
8、第四次从三个数里取随机数,为1,则将第1个数取出,变为0*3,取出的数为 1
9、而后,将第2个数交换到第1个数的位置上,即数字变为 03
10、第五次从两个数里取随机数,为0,则将第0个数取出,变为*3,取出的数为 0
11、而后,将第1个数交换到第0个数的位置上,即数字变为 3
12、第六次随机数为0,则将第0个数取出,变为*,取出的数为 3
即,取到的数为 425103。
另外,代码有错误,已更改。
package test;
import java.util.Hashtable;
import java.util.Random;
import java.util.Vector;
public class DaLuan {
/**
* 长度为 s 的序列,从中随机抽取 n 个数据。
* 算法:
* 1、先在 0-s 里随机取一数 [R];
* 2、将 [R] = [0], [0]将不再使用
* 3、先在 1-s 里随机取一数 [R1];
* ...
* @param s
* @param n
* @return
*/
private static int[] getRandom(int s, int n)
{
if(s<=0 || n<=0)
{
throw new RuntimeException("必须:s>0 且 n>0 ");
}
if(s<n)
{
throw new RuntimeException("必须:s>=n ");
}
int[] data = new int[n];
int[] temp = new int[s];
for(int i=0; i<s; i++)
{
temp[i] = i;
}
Random random = new Random();
random.setSeed(System.currentTimeMillis());
for(int i=0; i<n; i++)
{
int idx = random.nextInt(s-i)+i;
data[i] = temp[idx];
temp[idx] = temp[i];
}
return data;
}
private static void print(int[] data)
{
for(int i=0; i<data.length; i++)
{
System.out.println(data[i]);
}
}
/**
* 长度为 s 的序列,从中随机抽取 n 个数据。
* 算法:
* 1、先在 0-s 里随机取一数 [R];
* 2、将 [R] = [0], [0]将不再使用
* 3、先在 1-s 里随机取一数 [R1];
* ...
*
* 并列出随机数取了三次以上的数据
* @param s
* @param n
* @return
*/
private static int[] getRandom02(int s, int n)
{
if(s<=0 || n<=0)
{
throw new RuntimeException("必须:s>0 且 n>0 ");
}
if(s<n)
{
throw new RuntimeException("必须:s>=n ");
}
int[] data = new int[n];
int[] temp = new int[s];
int[] selectCount = new int[s];
for(int i=0; i<s; i++)
{
temp[i] = i;
selectCount[i] = 0;
}
Random random = new Random();
random.setSeed(System.currentTimeMillis());
for(int i=0; i<n; i++)
{
int idx = random.nextInt(s-i)+i;
data[i] = temp[idx];
selectCount[idx]++;
if(selectCount[idx]>1) //并列出随机数取了三次以上的数据
{
System.out.println(selectCount[idx] + ":" + idx);
}
temp[idx] = temp[i];
}
return data;
}
/**
* 这个版本针对的是从百亿级数据里取数据的。
*
* 长度为 s 的序列,从中随机抽取 n 个数据。
* 算法:
* 1、先在 0-s 里随机取一数 [R];
* 2、将 [R] = [0], [0]将不再使用
* 3、先在 1-s 里随机取一数 [R1];
* ...
* @param s
* @param n
* @return
*/
private static long[] getRandom03(long s, int n)
{
if(s<=0 || n<=0)
{
throw new RuntimeException("必须:s>0 且 n>0 ");
}
if(s<n)
{
throw new RuntimeException("必须:s>=n ");
}
long[] data = new long[n];
Hashtable<Long, Long> ht = new Hashtable<Long, Long>();
Random random = new Random();
random.setSeed(System.currentTimeMillis());
for(int i=0; i<n; i++)
{
long l = random.nextLong();
if(l<0)
{
l= Math.abs(l);
}
long idx = l % (s-i);
if(ht.get(idx)==null)
{
data[i] = idx;
}
else
{
data[i] = ht.get(idx);
}
if(ht.get(s-i-1)==null)
{
ht.put(idx, s-i-1);
}
else
{
ht.put(idx, ht.get(s-i-1));
}
}
return data;
}
public static void main(String[] args)
{
System.out.println(Runtime.getRuntime().maxMemory());
//Collections.shuffle(null);
//print(getRandom02(3000000, 2500));
//getRandom03(10000000000L, 1000000);
getRandom03(10000000000L, 800000);
//getRandom03(10000000000L, 1000000); //需要设置vm参数 -Xms64M -Xmx256M
}
}
分享到:
相关推荐
世界各国/实体的世界人口数据。 它共包含235条记录,11列包含2020年前总人口、年变化、净变化、密度、土地面积、移民、生育率、中年人、城市人口和世界人口份额的数据。
背景描述1950年后,国际时局稳定,人口成为逐年关注的重点话题,通过人口的波动,可以推测各国各年的大事件影响,以及出生,死亡,移民等数据,分析国力与影响力;数据说明1950-2021世界各国人口总量、出生、死亡及...
10. **人口政策**:各国根据自身的人口状况制定相应的人口政策,如计划生育、鼓励生育、移民政策等,以应对人口问题。 综上所述,"世界各国人口数据.zip"这个压缩包中的数据对于研究全球人口趋势、政策制定者制定...
农村移民安置规划设计是针对因各种原因(如水利建设、自然灾害防治等)需要迁移的农村居民进行的规划工作,旨在确保移民的生活质量和经济稳定。这项工作涉及到多个层面,包括实物指标数据管理、社会经济数据管理以及...
而在美国人口调查方面,这些数据可以帮助我们理解人口结构,移民来源地,移民目的,以及移民对美国社会和经济的影响。 标签 "xlsx" 指的是这些数据是以Microsoft Excel的.xlsx文件格式存储的。Excel是一种常见的...
标题“matlab开发-美国人口增长模型”表明我们要探讨的是使用MATLAB编程语言构建的用于预测美国人口增长的数学模型。MATLAB是一种强大的数值计算和数据可视化工具,它被广泛应用于科学计算、工程分析和教育领域。在...
随着我国大中型水利水电工程的大量建设,需要迁移的人口数量急剧增加,移民安置的风险管理变得更加复杂和重要。冯雪在其研究中提出了一个风险管理体系,以分析和评价水库移民安置过程中的各种风险因素。 水库移民...
骋天水库移民GIS应用系统是以地理信息系统(GIS)和数据库为开发平台的可视化动态信息管理系统,通过互联网为广大公众提供移民信息的动态查询功能,为各级水利移民工作者提供可视化的网络业务处理平台。 骋天通过该...
该文主要探讨了人口增长模型的数学建模方法,针对中国人口问题,通过最小二乘拟合法预测1999年至2008年间的人口发展趋势。以下是文章中涉及的关键知识点: 1. **人口增长模型**:人口增长模型是描述人口数量随时间...
3. **政策模拟**:软件可以模拟不同政策对人口结构和数量的影响,如生育政策、移民政策等,帮助决策者评估政策效果。 4. **城市规划**:在城市规划中,人口预测是必不可少的环节,软件能为城市基础设施建设、公共...
报告标题:“2020年全球人口超过100万的城市群中的人口(占总人口的百分比)排名报告” 这份报告聚焦于一个关键的环境和社会统计指标——人口超过100万的城市群中的人口占总人口的百分比。这个指标用于衡量一个国家...
2020年中国都市圈“新移民”吸引力报告通过深入研究和分析,揭示了都市圈化背景下,中国流动人口群体的新趋势和特点,以及30个核心都市圈对“新移民”的吸引力。报告详细探讨了中国城市人口流动的新趋势,对“新移民...
标题和描述中提到的PPT学习教案主要关注的是八年级地理上册中关于人种、人口以及合理人口政策的主题。这个教学材料通过分析不同国家的人口情况,探讨了人口增长速度对国家发展的影响,旨在教育学生理解人口问题的...
《数学建模与人口模型讲义》是一份深入探讨数学建模在人口研究中的应用的资料,主要聚焦于如何利用数学工具理解和预测人口动态。在当今社会,人口问题已成为全球关注的焦点,从人口增长、老龄化到迁移模式,都需要...
移民持续时间长,影响深远,形成了众多的山东庄,山东移民后裔在关中地区繁衍生息,数量达到三十多万。这不仅改变了关中的人口结构,也带来了山东地区的文化传承,影响了当地的社会经济和文化发展。 总结来说,清末...
在本主题"人口预测建模讲解与代码"中,我们将深入探讨如何利用数学建模方法对人口发展趋势进行预测。这是一门结合统计学、计算机科学和应用数学的学科,旨在通过对历史人口数据的分析,构建预测模型,以预估未来人口...
胡润研究院与汇加移民发布《中国投资移民白皮书》.pdf
2. **数据内容**:2010-2015年的数据可能包括年龄、性别、种族、族裔、教育水平、职业、收入、家庭结构、婚姻状况、住房状况、出生地、移民状况等多种人口统计指标。这些数据通常以表格形式存在,可能包含国家、州、...
【摘要分析】 这篇摘要主要介绍了2007年全国数模赛中的一项研究,该研究构建了两个模型来预测中国...然而,任何模型都有其局限性,实际人口动态可能受到模型未考虑的多种因素影响,如移民政策、科技进步和经济波动等。