| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1410 人关注过本帖
标题:1、随机涵数问题
只看楼主 加入收藏
zjl1616
Rank: 1
等 级:新手上路
帖 子:21
专家分:3
注 册:2010-5-10
结帖率:28.57%
收藏
已结贴  问题点数:20 回复次数:29 
1、随机涵数问题
我表中有8863条记录,表中有一个HS字段,我想随机产生1到8863个数字赋给HS字段,请高手帮忙,谢谢!!
搜索更多相关主题的帖子: 记录 
2014-03-06 17:32
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:3 
搜一下rand

DO IT YOURSELF !
2014-03-06 17:36
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:3 
RAND(-1)
REPLACE ALL HS WITH RAND()*10000

坚守VFP最后的阵地
2014-03-06 17:38
zjl1616
Rank: 1
等 级:新手上路
帖 子:21
专家分:3
注 册:2010-5-10
收藏
得分:0 
版主,不能有重复的数字呀!就是1到8863个不重复的整数赋给HS字段
2014-03-06 17:48
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
用循环往出踢呗  好像也没啥好招

DO IT YOURSELF !
2014-03-06 17:52
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:3 
楼主,你出的这道题如果从常规思路去考虑会很难,困难的核心就在于随着被分配过序号的记录越来越多,随机产生的序号重复率也就越来越高,如此就可能会造成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 编辑 ]
2014-03-06 19:04
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
补充一下:如果表记录数量庞大的话,可能会运行较长时间,要耐心等待的。
2014-03-06 19:09
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:0 
楼主的要求可能不现实,我循环了200万次,也没达到楼主的1-8863,而且每次随机的数据都不一样。奉劝楼主放弃这种想法吧。代码如下:
程序代码:
CREATE CURSOR T (HS N(4))
FOR lnI=1 TO 8863
    APPEND BLANK
ENDFOR

RAND(-1)
S=1
LC=[]
FOR I=1 TO 2000000
    LN=ROUND(RAND()*I,0)
    IF BETWEEN(LN,1,8863) AND NOT TRANSFORM(LN)$LC
       REPLACE RECORD S+1 HS WITH LN IN T
       LC=LC+TRANSFORM(LN)+[+]
       S=S+1
    ENDIF
    IF S>8863
       EXIT
    ENDIF
ENDFOR

SELECT * FROM T ORDER BY HS WHERE NOT EMPTY(HS)


坚守VFP最后的阵地
2014-03-06 19:32
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
才细看了一下楼主的要求  他是8863对应8863 只不过是不对号入座而已

这个应该好弄了 弄一个踢一个就好了

DO IT YOURSELF !
2014-03-06 19:57
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:3 
提供一个思路
建个2字段表 一个HS 一个SJS
把HS用1-8863填充 SJS用随机数填充 然后按SJS排下序
最后把HS字段替换原表HS字段
2014-03-06 20:11
快速回复:1、随机涵数问题
数据加载中...
 
   



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

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