楼主,你出的这道题如果从常规思路去考虑会很难,困难的核心就在于随着被分配过序号的记录越来越多,随机产生的序号重复率也就越来越高,如此就可能会造成VFP失去响应。其实,这道题可以反向思维:设置一个循环,从1到记录数,这个循环变量就可以作为序号,而且一定是不重复的。然后用SELECT-SQL语句筛选出HS未被分配过序号的记录,从这些记录中随机挑选一个分配当前循环变量的值,也即分配一个当前序号。分配完成后再筛选出未被分配序号的记录,再随机挑选一个,再分配... ... 直到循环结束,所有记录就都被分配上了序号。虽然序号的循环是顺序的,但被分配的记录挑选是随机的,所以也就变相达到了你的目的。用这种算法,不会有重复序号之忧。
程序代码如下(红色部分是核心):
SET TALK OFF
SET SAFETY OFF
SET COMPATIBLE OFF
CLOSE ALL
RAND(-1)
IF FILE("随机序号.DBF") THEN
USE 随机序号
ZAP
ELSE
CREATE TABLE 随机序号 (ABC V(3),HS I)
FOR I=1 TO 8863
INSERT INTO 随机序号 (ABC) VALUES (CHR(INT(RAND()*26+65)))
NEXT
ENDIF
FOR I=1 TO RECCOUNT()
SELECT RECNO(),HS FROM 随机序号 WHERE HS=0 INTO ARRAY Temp
数量=ALEN(Temp,1) &&统计出还有多少记录没有分配序号
序号=INT(RAND()*数量+1) &&从这些记录中随机产生一个来分配
UPDATE 随机序号 SET HS=I WHERE RECNO()=Temp(序号,1)
NEXT
SET TALK ON
SET SAFETY ON
RETURN
执行效果图无法贴上来,你自己执行一下,然后用“SELECT COUNT(DISTINCT HS) FROM 随机序号”命令看一下,如果查询结果的数字等于你表文件的记录数,就说明执行成功。
[
本帖最后由 taifu945 于 2014-3-6 19:14 编辑 ]