| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1068 人关注过本帖, 1 人收藏
标题:将教师随机插入表内(一定条件下)
只看楼主 加入收藏
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
结帖率:82%
收藏(1)
已结贴  问题点数:20 回复次数:12 
将教师随机插入表内(一定条件下)
我一这样一张表
现在想将10个教师随随机插入表内,满足这样两个条件
一是:每个进入机率差不多,或者说每个人进入表内只能比别人多一次或少一次
如张三在表内3次其它人最少2次最多四次相差不能超过2次
二是:同一科目中只能去一次
请问如何实现
考试表.rar (520 Bytes)
搜索更多相关主题的帖子: 如何 教师 
2013-06-10 19:57
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:20 
这件事在Excel中利用规划求解实现比较容易,用VFP编程比较麻烦。其实这是一个求不重复随机数的案例,且还有横向比较限制。今儿个晚了,明儿个看看是否能给出答案。
2013-06-10 22:49
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:0 
回复 2楼 taifu945
如何规化求解请指教
2013-06-11 10:36
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2214
专家分:3882
注 册:2007-4-27
收藏
得分:0 
7个教室,三个学科,共需21人次,现有10个教师,算来只要有一个教师3次,其余每人2次。
我“土八路”的算法简单:将教师1-10号编好,语文1-7号,数学8-10、现1-4号,英语5-10号、再1号。完事,也满足楼主的要求了

只求每天有一丁点儿的进步就可以了
2013-06-11 10:55
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用dzy123在2013-6-11 10:36:59的发言:

如何规化求解请指教
我正在编写程序,已经有眉目。等上传了程序后再帮你看看Excel中如果用规划求解去解决。
2013-06-11 11:37
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:0 
以下是引用taifu945在2013-6-11 11:37:16的发言:

我正在编写程序,已经有眉目。等上传了程序后再帮你看看Excel中如果用规划求解去解决。
谢谢你的帮助
2013-06-11 12:35
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:0 
以下是引用wengjl在2013-6-11 10:55:47的发言:

7个教室,三个学科,共需21人次,现有10个教师,算来只要有一个教师3次,其余每人2次。
我“土八路”的算法简单:将教师1-10号编好,语文1-7号,数学8-10、现1-4号,英语5-10号、再1号。完事,也满足楼主的要求了这
这是一个模拟数据,真实数据可能不是一个老师差一堂而是多个,这种方法不大好弄
2013-06-11 12:38
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用dzy123在2013-6-11 12:35:13的发言:

谢谢你的帮助

不用客气,程序出来了,看看效果是不是你需要的:
图片附件: 游客没有浏览图片的权限,请 登录注册


程序代码如下:
****************************************
* 思路:一共有3门课,每门课需要7名教师 *
* 总计21人次。根据课程和教室循环,随机 *
* 挑出教师填充。最后一门课肯定有空档需 *
* 要某些教师分配第三次的,作特殊处理。 *
****************************************
SET SAFETY OFF
SET TALK OFF
CLOSE ALL

************************************
* 教师表用来存储教师姓名及分配次数 *
* 以供程序进行判断使用             *
************************************
CREATE CURSOR 教师 (姓名 C(6),分配次数 I)
FOR I=1 TO 10
   INSERT INTO 教师 VALUES ("教师"+LTRIM(STR(I)),2)
NEXT &&I
****************************
* 已分配表用来存储分配情况 *
* 以供程序进行判断使用     *
****************************
CREATE CURSOR 已分配 (课名 C(4),姓名 C(6))
**************
* 清空考试表 *
**************
UPDATE 考试表 SET 语文=[],数学=[],英语=[]

************
* 开始分配 *
************
RAND(-1)
课程门数=3
教室数=7

****************************************
* 加以下两个变量的目的是防止最后一门课 *
* 时,若有教师在前面没分配过,会产生在 *
* 该门课程重复分配的bug。              *
****************************************
最后可分配数=0
最后课程填补=.F.

FOR I=1 TO 课程门数
   课程名=FIELD(I+1,"考试表")
   FOR J=1 TO 教室数
      IF !最后课程填补
         IF J=1 &&第1次分配
            SELECT 姓名 FROM 教师 ;
               WHERE 分配次数>0 INTO ARRAY 教师名
         ELSE
            SELECT 姓名 FROM 教师 ;
               WHERE 姓名 NOT IN ;
                  (SELECT 姓名 FROM 已分配 WHERE 课名=课程名) AND ;
                  分配次数>0 ;
               INTO ARRAY 教师名
         ENDIF
         可分配数=ALEN(教师名)
         IF I=课程门数 AND 最后可分配数=0 &&最后一门课程时
            最后可分配数=可分配数 &&记录下最后可分配的教师数
         ENDIF
      ENDIF
      教师序号=INT(RAND()*可分配数+1)
      ******************
      * 修改教师表信息 *
      ******************
      UPDATE 教师 SET 分配次数=分配次数-1 WHERE 姓名=教师名[教师序号]
      ********************
      * 添加已分配表信息 *
      ********************
      INSERT INTO 已分配 VALUES (课程名,教师名[教师序号])
      ******************
      * 修改考试表信息 *
      ******************
      UPDATE 考试表 SET &课程名=教师名[教师序号] WHERE VAL(教室)=J
      
      ****************************************
      * 此段代码用来对最后一门课缺教师的填充 *
      ****************************************
      IF I=课程门数
         IF 最后可分配数>1
            最后可分配数=最后可分配数-1
         ELSE
            IF J<7
               最后课程填补=.T.
               SELECT 姓名 FROM 教师 ;
                  WHERE 姓名 NOT IN ;
                     (SELECT 姓名 FROM 已分配 WHERE 课名=课程名) ;
                  INTO ARRAY 教师名
               可分配数=ALEN(教师名)
            ENDIF
         ENDIF
      ENDIF

   NEXT &&J
NEXT &&I         

SET SAFETY ON
SET TALK ON
CLOSE ALL

RETURN

若课程门数或教室数有变化,只需改两个变量的赋值即可,核心代码可基本沿用。若对代码有疑问,可跟帖发问,我会回答。


[ 本帖最后由 taifu945 于 2013-6-11 13:50 编辑 ]
收到的鲜花
  • tlliqi2013-06-11 20:30 送鲜花  20朵   附言:加分
2013-06-11 13:12
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:0 
回复8楼还在不
2013-06-11 19:12
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
在Excel中实现随机排教师的方法也已经研究出来了,不过没有我想象中的简单,需要用到迭代计算和循环引用。循环引用指两个单元格之间的公式互相引用。比如,B1中的公式引用到了A1,而A1中的公式又引用到了B1。这种匪夷所思的引用方式在一般情况下用不到,也不允许,但可以用在生成不重复随机值上面。若想让这种引用方式正常使用,就要在选项中勾选“启用迭代计算”。以Excel 2013为例:“文件”→“选项”→“公式”→“启用迭代计算”→“最多迭代次数”可以设置得大些,我设置了500。
图片附件: 游客没有浏览图片的权限,请 登录注册

在Excel 2007、2010中用相同的方法设置。Excel 2007没有“文件”标签,而是一个微软徽标的按钮。对于Excel 2003及以前版本,实在太老了,我已经记不清了,但核心是找到“选项”。
图片附件: 游客没有浏览图片的权限,请 登录注册

这张图是全部的设置,其中,中间那张表格的数据就是你要的结果。
还是以Excel 2013为例:
(1)先建立教师表,A1:A11以及B1等单元格全部手工录入。点击A1:A11中的任一单元格,按CTRL+T,在弹出的对话框中勾选“表包含标题”项,确定,把它转换成一个表(Excel 2003及以前版本不支持“表”)。单击B2:B11中的任一单元格,输入公式“=COUNTIF($E$2:$G$8,[@教师名])”后回车,其它单元格会自动填入相同的公式(这是“表”的一个特点)。选择“设计”标签页,勾选“汇总行”复选框。
图片附件: 游客没有浏览图片的权限,请 登录注册

到此,教师表完成。
(2)当中的考试表,留下E2:G9区域,其它单元格如图手工录入数据(不要把它转换成“表”)。同时选中E2:E8,在公式栏中输入公式“=IF(SUM(I$2:I$8)<>ROWS(I$2:I$8), INDEX($A$2: $A$11,INT(RAND()*10+1)),E$2:E$8)”,然后按Ctrl+Shift+回车,生成数组公式。记住,必须生成数组公式。同样,选中F2:F8,输入“=IF(SUM(J$2:J$8)<>ROWS(J$2:J$8),INDEX( $A$2:$A$11,INT(RAND()*10+1)),F$2:F$8)”;G2:G8输入“=IF(SUM(K$2:K$8)<>ROWS(K$2:K$8),INDEX($A$2:$A$11,INT(RAND()* 10+1)),G$2:G$8)”,全部是数组公式。在E9单元格输入“=SUMPRODUCT(1/COUNTIF(E$2:E$8,E$2:E$8))”,并拖曳到F9和G9两个单元格,公式中的相对引用部分会自行改变。到此,考试表完成。
(3)接下去就是做三个辅助列,辅助列的作用是帮助控制每门课程生成的7位教师是唯一的。选中I2:I8,输入公式“=COUNTIF(E$2:E$8,E$2:E$8)”,并按Ctrl+Shift+回车,生成数组公式。而J2:J8、K2:K8分别输入数组公式“=COUNTIF(F$2:F$8,F$2:F$8)”、“=COUNTIF(G$2:G$8,G$2:G$8)”。从公式中看到,I、J、K分别用于控制语文、数学、英语三门课。

当你建立完辅助列时,前面键入公式的单元格就会自动产生结果了。如果觉得教师表中出现的分配次数不满意,可以刷新公式,让其重新计算。方法是:选中I2:I8、J2:J8、K2:K8三个区域中的任一区域(注意:最好整区域的选中,不要只选中其中一个单元格),然后点击公式栏,按Ctrl+Shift+回车。若还不满意,可以重复这个操作,直到出现满意的结果为止。

最后,提醒一下,由于随机函数RAND()属于易失性函数,也就是进行了其它操作后,它会自动刷新。故,建议你,出现了满意的结果后,用粘贴值的方法将数据及时复制出来。



[ 本帖最后由 taifu945 于 2013-6-11 19:56 编辑 ]
2013-06-11 19:55
快速回复:将教师随机插入表内(一定条件下)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030462 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved