| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1410 人关注过本帖
标题:1、随机涵数问题
只看楼主 加入收藏
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用TonyDeng在2014-3-6 21:27:48的发言:

 
CLEAR ALL
SET SAFETY OFF
CLEAR
CREATE TABLE test FREE (hs I, rec I)
SELECT "test"
RAND(-1)
FOR nIndex = 1 TO 8863
    INSERT INTO test (rec, hs) VALUES (ROUND(1000000 * RAND(), 0), nIndex)
NEXT
SORT TO test_rand ON rec
USE "test_rand" EXCLUSIVE
BROWSE
USE IN "test_rand"
CLEAR ALL
RETURN


最後把rec字段刪掉即可

这也是个办法。
2014-03-06 22:46
Tiger5392
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:88
帖 子:2775
专家分:2237
注 册:2006-5-17
收藏
得分:3 
以下是引用zjl1616在2014-3-6 17:32:39的发言:

我表中有8863条记录,表中有一个HS字段,我想随机产生1到8863个数字赋给HS字段,请高手帮忙,谢谢!!
增加一个字段tmp n(15,13),放入随机数,根据这个字段索引,将1-8863依次填入HS字段,删除字段tmp

感言:学以致用。 博客:http://www./blog/user14/65009/index.shtml email:Tiger5392@
2014-03-07 09:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
*-----------------------------
* 不用臨時表的方法
*-----------------------------
DIMENSION aDatas[8863,2]
RAND(-1)
FOR nIndex = 1 TO ALEN(aDatas, 1)
    aDatas[nIndex,1] = ROUND(1000000 * RAND(), 0)
    aDatas[nIndex,2] = nIndex
NEXT
ASORT(aDatas, 1)        && 把這裏最終數組的第二列順序填入目標數據表的hs字段中即可



[ 本帖最后由 TonyDeng 于 2014-3-7 11:33 编辑 ]

授人以渔,不授人以鱼。
2014-03-07 11:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
5-10秒?這種功能需求,一旦實現用時超過1秒,就已經不可忍受,必須改算法了。

授人以渔,不授人以鱼。
2014-03-07 12:19
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
原来的代码有点慢了,这段代码快了不少。修改了算法:运用内存数组排序和SELECT-SQL命令结合来代替原先循环结构中每填充一条记录就要重新查询一遍的算法。原理:内存中操作肯定比反复读写硬盘数据快,所以用了内存数组暂存数据;SELECT-SQL命令哪怕内嵌了子查询也比8千多遍循环要快得多,所以将数组的结果化作临时表,与原表进行连接查询,生成目标表文件。下面截图我办公室电脑的配置,运行时就一闪后完成。
图片附件: 游客没有浏览图片的权限,请 登录注册


SET TALK OFF
SET SAFETY OFF
SET COMPATIBLE OFF
CLOSE ALL
RAND(-1)

IF FILE("随机序号.DBF") THEN
   ALTER TABLE 随机序号 DROP HS
ELSE
   CREATE TABLE 随机序号 (ABC V(3))
   FOR I=1 TO 8863
      INSERT INTO 随机序号 VALUES (CHR(INT(RAND()*26+65)))
   NEXT
ENDIF

DIMENSION Temp[RECCOUNT(),2]
FOR I=1 TO RECCOUNT()
   Temp[I,1]=RAND()
   Temp[I,2]=I
NEXT
ASORT(Temp,1)
CREATE CURSOR TempTable (Field1 I,HS I)
INSERT INTO TempTable FROM ARRAY Temp
SELECT T1.*, T2.HS ;
   FROM ;
      (SELECT RECNO() RECID,* FROM 随机序号) T1,;
      (SELECT RECNO() RECID,HS FROM TempTable) T2;
   WHERE T1.RECID=T2.RECID ;
   INTO TABLE 随机序号2
ALTER TABLE 随机序号2 DROP RECID
CLOSE ALL
DELETE FILE 随机序号.*
RENAME 随机序号2.DBF TO 随机序号.DBF
USE 随机序号

SET TALK ON
SET SAFETY ON
RETURN
2014-03-07 16:28
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9805
专家分:26913
注 册:2012-2-5
收藏
得分:0 
排序?那还不如直接将数据从1-8863直接填入表中
楼主要求的是随机顺序产生的数据。


[ 本帖最后由 sdta 于 2014-3-7 19:30 编辑 ]

坚守VFP最后的阵地
2014-03-07 19:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
要解決無重複問題必須要排序的

授人以渔,不授人以鱼。
2014-03-07 19:43
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9805
专家分:26913
注 册:2012-2-5
收藏
得分:0 
排序后,结果不就是从1到8863了吗

坚守VFP最后的阵地
2014-03-07 20:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用sdta在2014-3-7 20:03:28的发言:

排序后,结果不就是从1到8863了吗

是對隨機數排序,但最後獲取的不是隨機數,而是排序前的順序號,後者是無重複的順序號被打亂,要的是這個。基本原理是:把順序打亂,與順序填入隨機數,功能是等效的,但順序號恰好是保證無重複的,而隨機數不能保證。

授人以渔,不授人以鱼。
2014-03-07 20:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你把我23樓代碼中的數組aDatas排序前後的結果打印出來比較一下就知道原理了,把數組尺寸縮小一點(到20)看得很清楚。

授人以渔,不授人以鱼。
2014-03-07 20:14
快速回复:1、随机涵数问题
数据加载中...
 
   



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

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