| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1410 人关注过本帖
标题:1、随机涵数问题
只看楼主 加入收藏
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用wp231957在2014-3-6 19:57:09的发言:

才细看了一下楼主的要求  他是8863对应8863 只不过是不对号入座而已

这个应该好弄了 弄一个踢一个就好了
你踢下看看

坚守VFP最后的阵地
2014-03-06 20:29
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
无需那么复杂,反向考虑即可。固定序号,随机挑个HS字段为0的记录填充就好了,填满为止。用这种方法,可以解决任何范围内的不重复连续随机数。如果从正向考虑,不重复的随机数很难超过20个,别说8千多个。
2014-03-06 20:38
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用sdta在2014-3-6 20:29:58的发言:

你踢下看看
我vfp好长时间不用  就不献丑了

这是我的c代码
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand((unsigned)time(NULL));
    int  t[8863]={0};   //因c里没有dbf 所以用这个数组代表原始数字表
    int  t2[8863]={0};  //这个用于存放随机的1--8863的数列 也是8863个 而且各不相同 只不过顺序被打乱
    int i;
    for(i=0;i<8863;i++) t[i]=i+1;     //将原始数字表初始化为1--8863的递增为1的顺序数列
    for(i=0;i<8863;i++)
    {
        rep:                         //@1
        int ch=rand()%8863;
        if(t[ch]!=0)
        {
            t2[i]=t[ch];
            if(i%14==0 && i>0) printf("\n"); printf("%6d",t2[i]);  //这个是用于屏幕输出的语句 每行输出14个 每个数字宽度为6
            t[ch]=0;        //选中数据后 立即在原始数字表中置 0 以便下次挑选时 把他pass

        }else goto rep;              //@2  此处与@1 构成小循环 专门踢重复数据
       
    }
    printf("\n");
    return 0;

}
大约5-7秒钟左右吧  运行结束   肯定不超过10秒



[ 本帖最后由 wp231957 于 2014-3-6 20:40 编辑 ]

DO IT YOURSELF !
2014-03-06 20:39
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用wp231957在2014-3-6 20:39:20的发言:

我vfp好长时间不用  就不献丑了

这是我的c代码#include  
#include  
#include  
 
int main()
{
    srand((unsigned)time(NULL));
    int  t[8863]={0};   //因c里没有dbf 所以用这个数组代表原始数字表
    int  t2[8863]={0};  //这个用于存放随机的1--8863的数列 也是8863个 而且各不相同 只不过顺序被打乱
    int i;
    for(i=0;i<8863;i++) t[i]=i+1;     //将原始数字表初始化为1--8863的递增为1的顺序数列
    for(i=0;i<8863;i++)
    {
        rep:                         //@1
        int ch=rand()%8863;
        if(t[ch]!=0)
        {
            t2[i]=t[ch];
            if(i%14==0 && i>0) printf("\n"); printf("%6d",t2[i]);  //这个是用于屏幕输出的语句 每行输出14个 每个数字宽度为6
            t[ch]=0;        //选中数据后 立即在原始数字表中置 0 以便下次挑选时 把他pass
 
        }else goto rep;              //@2  此处与@1 构成小循环 专门踢重复数据
        
    }
    printf("\n");
    return 0;
 
}大约5-7秒钟左右吧  运行结束   肯定不超过10秒

仔细看了下你的代码,原理也是先固定了序号。S版的思路与你不同,他不固定序号的范围,让机器随机生成这个范围,这条路很难的。我说了,随机数不产生重复率很难超过20个数字的范围。
2014-03-06 20:54
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
其实小t版的想法也不错  增加一个字段  随机写入一批数据  然后排序  然后 原始字段就相对 随机了  哈哈

DO IT YOURSELF !
2014-03-06 20:56
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用wp231957在2014-3-6 20:56:25的发言:

其实小t版的想法也不错  增加一个字段  随机写入一批数据  然后排序  然后 原始字段就相对 随机了  哈哈
T版的算法我貌似没看懂:SJS字段在填充随机数时不也会碰到重复随机数的问题吗?难道是用HS事先填好的序列数?
2014-03-06 21:00
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 16楼 taifu945
个人理解  所谓的随机也是相对的
我们的程序加入了随机的概念  其实就是为了打乱原始数据  只要打乱就ok  有个别没乱的 也就那么地了  所以我说相对随机

DO IT YOURSELF !
2014-03-06 21:03
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
我前面说过了,循环300万次,也没凑够8863个不重复的随机数

坚守VFP最后的阵地
2014-03-06 21:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:3 
程序代码:
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 21:27
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:3 
CLOSE DATABASES
SELECT RECNO() bh,hs FROM 表名 INTO CURSOR lsb READWRITE
RAND(-1)
REPLACE ALL hs WITH RAND()*10000+SEC(DATETIME())
SORT TO lsort ON hs
USE lsort
SELECT 表名
FOR i =1 TO RECCOUNT()
    GO i
    GO i IN lsort
    REPLACE hs WITH lsort.bh
NEXT

相互学习,互相交流,共同提高。
2014-03-06 22:25
快速回复:1、随机涵数问题
数据加载中...
 
   



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

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