| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3687 人关注过本帖
标题:奇偶数判定代码
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏(1)
得分:0 
以下是引用TZTJ在2015-10-23 11:50:25的发言:

rand(60)得到是一个什么常数。在你的代码中有rand(班+recno())是一个什么数呢?

以下是引用taifu945在2015-10-19 16:15:34的发言:

说一下我用随机数的情况哦:一般,程序初始化阶段,来一句“=RAND(-1)”(实际上任何负数都可)。这句的目的是为了让VFP在后面生成随机数时,以系统时间作为种子数。何为种子数?在我理解,目前常用的编程语言里用到的随机数函数生成的都是伪随机数,也就是事先已经有一组组的数字,然后这些数字有个序列号,这个序列号就叫“种子”。比如:你不停地用“?RAND(10)”命令,就只能得到0.21;如果你不停地输入“?RAND()”,就永远只能得到一组相同的数字序列。我这里的VFP9就是:0.85、0.55、0.91、... ...;两者结合着用:先输入“?RAND(10)”,得到0.21,再后面全部用“?RAND()”,就会得到序列号为10那组的一个个“随机”数字。但先用了“=RAND(-1)”,再用“?RAND()”命令,你会发现每次得到的数字就不一样。上面这些实验你可以通过反复运行或退出VFP测试结果,也即,用相同的正数作为种子号,或省略种子号,退出VFP再进入时,得到的“随机”数每次都是一样的;而如果用负数作为种子数,无论每次种子数是否一样,退出VFP再进入时,得到的随机数是不一样的。你可以理解为,用负数作为种子号,实际上是让VFP每次都自动换一个序列号,这样得到的随机数可以相对随机一点。
这里已经说得很详细。

rand(60)的60是一个种子数
这样看看,比较一下种子数不变之后与改变之后的变化
?rand(60)
?rand()
?rand()
?rand(60)
?rand()
?rand()
?rand(61)
?rand()
?rand()
?rand(61)
?rand()
?rand()

rand(班+recno())应该与rand(recno())效果相同,用recno()作为变动的种子,产生一个随机的索引序列。
2015-10-23 14:06
TZTJ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:737
专家分:115
注 册:2008-1-15
收藏
得分:0 
感谢!
2015-10-23 14:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏
得分:0 
这个示例用 RAND() 作为索引关键字来产生班序乱序,这种方法是否可靠有待探讨,还没搞清他的原理,只是对这个示例的模拟数据表产生的结果进行了简单检测,检测几次的结果没出现同班记录相连。用 RAND() 作为索引关键字来产生表记录乱序,对于不同的表结构和表数据可能有不同的效果,挺有趣的。

要确保不出现同班记录相连,可按"1班xx1,2班xx1,3班xx1,....1班xx2,2班xx2,3班xx2,...."记录整理好同级生的表。
2015-10-23 15:33
TZTJ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:737
专家分:115
注 册:2008-1-15
收藏
得分:0 
我正在解读你的代码,用rand()作为索引能产生班序乱序,究竟是什么原理,我也搞不明白。还有建考场表时,你的思路怎样?好像你是按列填数据吗?
2015-10-23 17:00
TZTJ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:737
专家分:115
注 册:2008-1-15
收藏
得分:0 
你是每个考场按列1、列3,列5,列7;列2、列4、列6、列8做一个循环吗?
2015-10-23 17:05
TZTJ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:737
专家分:115
注 册:2008-1-15
收藏
得分:0 
如果按行填记录,好像列1,列2,列3、列4....列8都是同年级,我实在搞不清

[此贴子已经被作者于2015-10-23 17:15编辑过]

2015-10-23 17:13
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏
得分:0 
以下是引用TZTJ在2015-10-23 17:00:52的发言:

我正在解读你的代码,用rand()作为索引能产生班序乱序,究竟是什么原理,我也搞不明白。还有建考场表时,你的思路怎样?好像你是按列填数据吗?

用 RAND() 作为索引关键字来产生班序乱序上面的贴也有讲到,效果原理还未清楚,可以分别试试只有一个字段的表、二个字段的表、三个字段的表.....多个字段的表,看看有什么规律。

建考场表做法,用文字表达不好说清楚,代码加点标注较易读些。
程序代码:
** 考试座位安排
** 要求:每一位考生的前后(行)是同级生而非同班生(或空)、左右(列)是非同级生(或空)。

n级 = 6    && 生成模拟数据的年级个数
n班 = 10   && 生成模拟数据的每年级班个数 
n行 = 8    && 考场每班座位行数
n列 = 8    && 考场每班座位列数
    * 建模拟数据
CREATE CURSOR 学生表 (级 I, 班 I, 名 C(20))
FOR i = 1 TO n级
    FOR j = 1 TO n班
        FOR k = 1 TO IIF(MOD(i, 2)==0, 60, 50)    && 不同级班人数不同
        *FOR k = 1 TO IIF(MOD(j, 2)==0, 60, 50)    && 不同班人数不同
            INSERT INTO 学生表 VALUES (i, j, PADL(i,2," ")+"年级"+PADL(j,2," ")+"班"+PADL(k,8,"x"))
        ENDFOR
    ENDFOR
ENDFOR
    * 建考场表
cCmd = "CREATE CURSOR 考场表 (考场 I"
FOR i = 1 TO n列
    cCmd = cCmd + ",列"+TRANSFORM(i)+" C(20)"
ENDFOR
cCmd = cCmd + ")"
EXECSCRIPT(cCmd)
    * 生成考场表数据
n场i = 1
n列i = 1
n行i = 0
FOR i = 1 TO n级
    建考场表(i, @n场i, @n列i, @n行i)
        * 同一考场相邻两列不同一个年级
        * 如果上一次处理的年级从第1列开始,则下一个年级从第2列开始,否则从第1列开始。
    n列i = IIF(n列i==1, 2, 1)
ENDFOR
    * 浏览考场表数据
SELECT 考场表
GO TOP 
BROWSE

    * 建考场表(n级i, n场i, n列i, n行i)
    * n级i ... 某年级,值传送
    * n场i ... 当前处理的考场号,地址传送
    * n列i ... 当前处理的考场表列号(字段号),地址传送
    * n行i ... 当前处理的考场表行号(记录号),地址传送
FUNCTION 建考场表(n级i, n场i, n列i, n行i)
    LOCAL i, n列k, n行k
        * 获取某年级数据
    SELECT * FROM 学生表 WHERE==n级i INTO CURSOR 级表
        * 按要求:同一考场考生的前后是同年级而不同一个班,在此用随机乱序处理来达到要求。
    SELECT 级表
    INDEX on RAND(班+RECNO()) TAG 班序    && 乱序
    *INDEX on RAND(RECNO()) TAG 班序    && 乱序
    GO TOP IN "级表"
        * 将某年级考生安排考场座位
    n列k = n列i
    n行k = n行i
    
    DO WHILE !EOF("级表")
            * 如果处理完最后一列
        IF n列k > n列
            n行k = n行k + n行                    && 下一个考场行起始
            IF (n行k+1) <= RECCOUNT("考场表")    && 如果还有适用空座位
                n列k = n列i                      && 从原来的起始列重新开始  
            ELSE
                n场i = n场i + 1                  && 没有适用空座位时添加一个新考场
                    * 如果当前的年级是从第2列开始的,则保存的行起始号变为当前处理中的行号
                IF n列i == 2
                    n行i = n行k                  && 保存行起始号  
                ENDIF
                n列i = 1                         && 新考场安排座位从第1列开始,并保存起始列号
                n列k = n列i
            ENDIF
        ENDIF
            * 安排一列座位
        i = 1
        DO WHILE !EOF("级表") AND (i <= n行)
                * 如果有适用的空座号就找号入座,否则新增一行座位。
            IF (n行k+i) <= RECCOUNT("考场表")
                GO (n行k+i) IN "考场表"
            ELSE
                APPEND BLANK IN "考场表"
                REPLACE 考场 WITH n场i IN "考场表"
            ENDIF
                * 对号入座,标记考生数据
            REPLACE ("列"+TRANSFORM(n列k)) WITH 级表.名 IN "考场表"
            i = i + 1
            SKIP IN "级表"
        ENDDO
            * 处理下一列
        n列k = n列k + 2    
    ENDDO
ENDFUNC
2015-10-23 19:21
TZTJ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:737
专家分:115
注 册:2008-1-15
收藏
得分:0 
吹水佬,你那么用心、细心的帮助,我不知用什么来感激你。我只能说,好人一生平安。
2015-10-23 21:20
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9828
专家分:27146
注 册:2012-2-5
收藏
得分:0 
回复 58楼 TZTJ
可以用RMB

坚守VFP最后的阵地
2015-10-23 21:45
TZTJ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:737
专家分:115
注 册:2008-1-15
收藏
得分:0 
回复 59楼 sdta
未免有一点太俗吧!是不是有损这个论坛的气氛。
2015-10-23 23:04
快速回复:奇偶数判定代码
数据加载中...
 
   



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

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