`
mozhenghua
  • 浏览: 324477 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一个简单的随机分组问题

阅读更多

背景

之前有个位朋友给我了一看了一段代码,大致意思是给一个列表,里面元素是人,需要将一个列表的用户随机分成两拨人,关键词是“随机”

List<String> allPerson = new ArrayList<String>();
		allPerson.add("何XX");
		allPerson.add("李XX");
		allPerson.add("屈XX");
		allPerson.add("刘XX");
		allPerson.add("王XX");
		allPerson.add("涂XX");
		allPerson.add("张XX");
		allPerson.add("方XX");
		allPerson.add("何XX");
		allPerson.add("周XX");
		List<String> aGroup = new ArrayList<String>();
		List<String> bGroup = new ArrayList<String>();
		for(int i=0; i<10; i++){
			String seedPerson = allPerson.get(new Random().nextInt(allPerson.size()));
			if(i%2==0){
				bGroup.add(seedPerson);
			}else{
				aGroup.add(seedPerson);
			}
			allPerson.remove(seedPerson);
		}
		
		//A组名单
		System.out.println("A组名单");
		for(String aStr:aGroup){
			System.out.println(aStr);
		}
		//B组名单
		System.out.println("B组名单");
		for(String bStr:bGroup){
			System.out.println(bStr);
		}

 大致意思是在将allPerson中的元素,随机分到aGroup bGroup 两个列表中去。核心的意思是每次从剩下的allPerson列表中随机取出(String seedPerson = allPerson.get(new Random().nextInt(allPerson.size()));

)一个员工,然后按照对2取模之后放到它应该的队列中去。

优化

看了这段代码以我对代码的审美标准,完全没有美感。于是很快的写了一段我认为美的代码:

List<String> allPerson = new ArrayList<String>();
		allPerson.add("何XX");
		allPerson.add("李XX");
		allPerson.add("屈XX");
		allPerson.add("刘XX");
		allPerson.add("王XX");
		allPerson.add("涂XX");
		allPerson.add("张XX");
		allPerson.add("方XX");
		allPerson.add("何XX");
		allPerson.add("周XX");
		List<String> aGroup = new ArrayList<String>();
		List<String> bGroup = new ArrayList<String>();
		
p = [aGroup ,bGroup ];
for(int i=0;i<allPerson.size();i++){
p[(int)(Math.random()*2)].add(list.get(i));
}

 写完给我朋友看了一下,被他一语道破,最后得出的结果根本不符合他的需求,因为他要求的是两个列表结果集合是要相同的大小,我写的算法两个列表的大小是随机的,所以这个写法是错的。

 

   被他指出之后,我重新想了一下该怎么写。应该先将列表随机排序一下,像这样的算法像我这样的懒人怎么会去开发呢,当然要依赖jdk中已经有的sdk工具。于是写了下面这段代码:

public void test() {
        List<String> allPerson = new ArrayList<String>();
        allPerson.add("何XX");
        allPerson.add("李XX");
        allPerson.add("屈XX");
        allPerson.add("刘XX");
        allPerson.add("王XX");
        allPerson.add("涂XX");
        allPerson.add("张XX");
        allPerson.add("方XX");
        allPerson.add("何XX");
        allPerson.add("周XX");
        List<String> aGroup = new ArrayList<String>();
        List<String> bGroup = new ArrayList<String>();
        Collections.shuffle(allPerson);
        vist(allPerson.iterator(), aGroup, bGroup);

        System.out.println(aGroup);
        System.out.println(bGroup);

    }
    private void vist(Iterator<String> it, List<String> aGroup, List<String> bGroup) {
        if (!it.hasNext()) {
            return;
        }
        aGroup.add(it.next());
        vist(it, bGroup, aGroup);
    }

 这里利用了Collections.shuffle()这个函数先将allPerson 打散,然后用的迭代函数vist遍历allPerson,在每次迭代的时候将aGroupbGroup参数位置互换一下,就能起到均匀给两个子列表添加记录了。当然这个遍历可以使用for循环用一个迭代子i++,每次判断取模之后是否为0,向两个子group中均匀添加数据。这种迭代的用法属于函数式编程的一个例子,每次看到迭代的方式实现一个函数,总感觉透着一股泥土般的清香,不是吗?

 

分享到:
评论

相关推荐

    VB制作的随机分组工具

    在这个项目中,我们看到的是利用VB开发的一个随机分组工具,这个工具的主要功能是帮助用户进行人员的随机分组,简化了传统的手动分组过程,提高了效率。 首先,我们需要理解VB中的核心概念。在VB中,程序由各种对象...

    C# 人员随机分组抽签工具及源代码

    在本文中,我们将深入探讨如何使用C#编程语言创建一个简单的人员随机分组及抽签工具。这个工具的实现基于给定的标题“C# 人员随机分组抽签工具及源代码”,描述中提到它是由Visual Studio 2010(VS2010)开发,用于...

    js实现分组随机显示程序

    这个`randomGrouping`函数接受起始值、结束值和每组大小作为参数,返回一个包含随机分组的二维数组。在实际应用中,可能需要根据具体需求增加更多的功能,如确保每组人数大致平衡,或者添加异常处理等。 在压缩包...

    动物随机分组软件

    一款简单易行的实验动物随机分组软件 很不错

    如何随机化分组-SPSS详细教程.docx

    随机分组是科学研究,尤其是临床试验中至...SPSS的这一功能使得随机分组变得简单易行,即使是对统计学不熟悉的研究者也能轻松掌握。在进行随机分组时,一定要确保操作的透明度和可重复性,以维护研究的科学性和公正性。

    C#随即分组程序采用ArrayList数组编写

    在本案例中,我们将探讨如何使用ArrayList来实现一个随机分组程序。 首先,我们需要导入必要的命名空间,如`System`和`System.Collections`,因为ArrayList属于`System.Collections`命名空间。接着,定义一个...

    效率工具—— 随机分组

    进行各种培训时对需要培训的人员随意进行分组,简单易用!

    临床试验随机分组方法.pdf

    为解决这个问题,可以使用随机数余数分组法,确保各组人数尽可能接近。例如,将15个病例随机分配到3组,通过随机数表和余数计算,可以进行必要的调整,以达到组间均衡。 区组随机化是一种更高级的随机化策略,特别...

    比赛分组小程序

    1. **随机数生成**:为了实现随机分组,程序需要使用随机数生成算法。在Python中,可以使用`random`模块中的`randint()`或`choice()`函数来生成指定范围内的随机整数,用于决定人员的分组归属。 2. **数据结构**:...

    计算机随机分组法在营养学实验研究中的应用.pdf

    计算机随机分组法在营养学实验研究中的应用是一个利用计算机技术进行实验分组的统计学方法,尤其在营养学实验设计中发挥着重要作用。通过该方法,研究者能够在确保实验对象分组的随机性和公平性的同时,更为高效地...

    抽签分组工具:可用于人员随机分组和人员随机顺序抽签 抓阄分组

    本篇文章将深入探讨一款基于ASP.NET技术开发的抽签分组工具,它能有效地进行人员随机分组和抽签,适用于各类活动的组织与管理。该工具由VS2010编程环境编译完成,具有简洁高效的特点,为用户提供了方便快捷的抓阄...

    简单的随机点名程序

    通过以上分析,我们可以看到一个简单的随机点名程序背后涉及的编程知识和技术并不简单,包括数据处理、用户交互、文件管理等多个方面。这样的程序不仅实用,而且是学习和掌握编程技能的良好实践。

    asp中实现随机分组程序的代码

    总的来说,这个ASP代码示例展示了如何在不使用复杂数据结构的情况下,利用基本的数组操作和随机数生成,实现一个简单的随机分组算法。这种方法虽然简单,但足以满足小型比赛或活动的分组需求。在实际应用中,可以...

    MySql分组后随机获取每组一条数据的操作

    首先,创建一个简单的测试表`xdx_test`,用于演示操作步骤: ```sql CREATE TABLE `xdx_test` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `class` varchar(255) DEFAULT NULL, PRIMARY KEY ...

    VB源码:比赛分组程序

    标题“VB源码:比赛分组程序”揭示了这是一个基于Visual Basic (VB) 开发的软件,用于组织和管理比赛的分组过程。这个程序的核心功能是实现抽签式的分组,确保比赛的公平性。它能从一个名为“list.txt”的文本文件中...

    使用html&amp;JS制作的考务分组随机抽签的网页应用

    满足较大规模人员面试考核时,对多组多岗位类的考务、考官人员的随机分组确定;随机排序组合,结果pdf加水印保存。 使用:在解包文件夹中,点击index.html,输入考核项目名称,即可进入分组抽签页面,页面设“项目...

    组长生成器,随机生成,支持1-12人

    发现大家在团队时都不想当组长,就随便写了一个随机生成组长的程序,直接点击未命名,然后录入组员名字,然后点击生成随机数,程序根据 组员人数生成相应的票数。可以多次点击随机生成,完成后点击确定。 程序里面有...

    随机抽样[下学期] 新人教版.pptx

    简单随机抽样是指在总体中每一个单位都有相等的被选中概率,且任何两个可能的样本之间彼此独立。例如,语文老师随机抽取8位同学背诵某首诗,每个人被选中的概率均等,没有偏倚,符合简单随机抽样的定义。而班长决定...

    对称 分组加密

    对称分组加密是密码学中的一个重要概念,它涉及到数据的加解密过程,其中对称加密是指使用相同的密钥进行加密和解密。而分组加密则是将长的明文消息分成固定长度的块(或称为“分组”)进行处理。在对称分组加密中,...

    随机点名小程序

    在这个小程序中,随机性的实现主要依赖于编程语言中的随机数生成函数,例如Python的random模块,它能够根据预设规则产生一系列不可预测的数字,这些数字对应着姓名列表中的位置,从而达到随机点名的效果。...

Global site tag (gtag.js) - Google Analytics