注册 登录
编程论坛 VFP论坛

利用VF9.0完成“摇号”怎样实现?

nmcfzxh 发布于 2021-08-18 17:31, 1428 次点击
将表1.dbf中的学生以身份证号为关键字段,每次摇出20名考生(已摇出考生不再参加摇号)并写入表2.dbf。直到摇够规定的人数。
7 回复
#2
nmcfzxh2021-08-18 17:32
新手学习中,幼稚之处请前辈谅解!
#3
schtg2021-08-19 05:45
提供一个思路仅供参考:第一步:将需要摇号的学生随机排序,取前20名,写入新表;第二步:删除刚才的前20名,余下学生再次随机排序,取前20名,写入新表,……直至需要的人数为止。
#4
nmcfzxh2021-08-19 09:01
谢谢!最好给代码!
#5
xuminxz2021-08-19 10:19
在表1中,加入数值字段px n(8,7)
sele 表1
INDEX on px DESCENDING Tag px
REPLACE px WITH RAND() FOR px>=0
SELECT * FROM jsmc WHERE RECNO()<=20 AND px>=0 INTO dbf dbar
repl px with -1 for RECNO()<=20 AND px>=0
SELECT  表2
APPEND FROM ls
#6
吹水佬2021-08-19 11:26
这样可否:
程序代码:
CREATE CURSOR b2 (f1 I)
CREATE CURSOR b1 (f1 I)
FOR i=1 TO 100
    INSERT INTO b1 VALUES (i)
ENDFOR
RAND(-1)
FOR i=1 TO 5  && 每次摇出20名, 直到摇够规定的人数
    SELECT TOP 20 f1,RAND() r FROM b1 WHERE f1 NOT in (SELECT f1 FROM b2) ORDER BY r INTO CURSOR tmp
    SELECT b2
    APPEND FROM DBF("tmp")
ENDFOR
SELECT * FROM b2
#7
mywisdom882021-08-19 12:56
rand(-1)
create cursor 中奖(身份证 C(18),姓名 C(10),等奖 C(10))
create cursor 名单(身份证 C(18),姓名 C(10))
for i=1 to 99
insert into 名单(身份证,姓名) values ("P"+padL(i,17,"0"),padl(i,3,"0"))
endfor


*!* 抽三等奖,20
SELECT TOP 20 身份证,姓名,RAND() as 随机 FROM 名单 WHERE 身份证 NOT in (SELECT 身份证 FROM 中奖) ORDER BY 随机 INTO CURSOR t1
INSERT INTO 中奖(身份证,姓名,等奖) SELECT 身份证,姓名,"三等奖" FROM t1
SELECT 中奖
BROWSE

*!* 抽二等奖,10
SELECT TOP 10 身份证,姓名,RAND() as 随机 FROM 名单 WHERE 身份证 NOT in (SELECT 身份证 FROM 中奖) ORDER BY 随机 INTO CURSOR t1
INSERT INTO 中奖(身份证,姓名,等奖) SELECT 身份证,姓名,"二等奖" FROM t1
SELECT 中奖
BROWSE

*!* 抽一等奖,3
SELECT TOP 3 身份证,姓名,RAND() as 随机 FROM 名单 WHERE 身份证 NOT in (SELECT 身份证 FROM 中奖) ORDER BY 随机 INTO CURSOR t1
INSERT INTO 中奖(身份证,姓名,等奖) SELECT 身份证,姓名,"一等奖" FROM t1
SELECT 中奖
BROWSE
#8
XUFN2021-08-19 13:42
**随机产生人员记录编号,编号是不重复的**

Re_Rand=.T.
Do While Re_Rand=.T.
   For Ivalue=1 To M_Prize_ShowPeople &&一次抽取几个人中奖
       Rand_Value(Ivalue)=Int(1+People_Total*Rand())
       Add_Rand_Value=Add_Rand_Value+"["+Alltrim(Str(Rand_Value(Ivalue)))+"]"
   Endfor
   For Each C  In Rand_Value
       If Occurs("["+Alltrim(Str(C))+"]",Add_Rand_Value)> 1 &&说明有重复
          Add_Rand_Value=""
          Re_Rand=.T.
          Exit
        Else
          Re_Rand=.F. &&一次抽取的这几个人不重复,退出Rand()
       Endif      
   Endfor
Enddo

这是一段本人很早很早以前编写的一个抽奖程序的一段代码,可以参考

[此贴子已经被作者于2021-8-19 13:46编辑过]

1