免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8491 | 回复: 28
打印 上一主题 下一主题

求随机序列的算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-19 22:37 |只看该作者 |倒序浏览
在偶的数据库中, 很多表需要用随机数来做主键, 产生随机数不难但是要保证不重复就有麻烦了

一个解决方案是, 先产生随即数然后到表里查询一下, 如果重复就再产生一次, 直到不重复为止, 显然这样做是很不爽的.

于是, 有了第二个方案先生成随即序列, 用SQUENCE顺次取出, 虽然解决问题但由于各表主键长短不一且有的是数字, 有的是英文字母加数字, 需要做很多序列出来, 还是不爽

最后就有了这样一个想法, 在开始的时候产生一个随即数, 用该随机数代表一个随机排列的数列, 然后, 用某种算法顺次算出下一个主键
但问题是, 偶不知道该怎样设计这个算法, 请高手指点 :lovely:

论坛徽章:
0
2 [报告]
发表于 2003-12-19 23:14 |只看该作者
这个问题有点难啊,咱在想是否换一种思路考虑
新建立一个随机表,需要多大就先产生多大的随机数后,使用PK与你的表做关联
这样把问题先解决好后,在结合,这样速度和查询就快许多了,而且简单可行

论坛徽章:
0
3 [报告]
发表于 2003-12-19 23:23 |只看该作者
最初由 ccwlm741212 发布
[B]这个问题有点难啊,咱在想是否换一种思路考虑
新建立一个随机表,需要多大就先产生多大的随机数后,使用PK与你的表做关联
这样把问题先解决好后,在结合,这样速度和查询就快许多了,而且简单可行 [/B]

恩, 这和上面第二个想法差不多, 主要问题是, 字段的长短有好几种, 而且随机变量的结果也不相同, 这么做要生成好几个表才行, 最长的主键是12位长且每一位都是0-Z共62种可能性, 算下来, 这个表的记录也太多了(虽然不一定要全部算出来)

论坛徽章:
0
4 [报告]
发表于 2003-12-19 23:29 |只看该作者
可你的第三种方法还是需要判断是否重复啊

建议做在一个表里,12+1个PK字段,先做最长的,后逐步截取,反正不重复就可以了

论坛徽章:
0
5 [报告]
发表于 2003-12-19 23:39 |只看该作者
最初由 ccwlm741212 发布
[B]可你的第三种方法还是需要判断是否重复啊

建议做在一个表里,12+1个PK字段,先做最长的,后逐步截取,反正不重复就可以了 [/B]

没太明白, 能否再详细说明一下

偶是这样想的
比如 只要0-9这几个数, 用随机数来确定它的序列是(当然确定的方法偶还没想好)
6478930125
然后, 只要取SEQUENCE号就能算出来了
如, 1->6 2->7.....
上面所说的算法实际上就是
不重复主键=F(SEQ, 某一随机数)

论坛徽章:
0
6 [报告]
发表于 2003-12-19 23:48 |只看该作者
只要0-9这几个数, 用随机数来确定它的序列是(当然确定的方法偶还没想好)
===============
你怎样保证你这个随机数来确定的序列不重复呢

其实我说的关键是先花时间产生好随机数还是在业务过程中产生随机数的问题,

我认为其实你的关键也在这里,而不是怎样产生随机数的问题

论坛徽章:
0
7 [报告]
发表于 2003-12-19 23:55 |只看该作者
最初由 ccwlm741212 发布
[B]只要0-9这几个数, 用随机数来确定它的序列是(当然确定的方法偶还没想好)
===============
你怎样保证你这个随机数来确定的序列不重复呢

其实我说的关键是先花时间产生好随机数还是在业务过程中产生随机数的问题,

我认为其实你的关键也在这里,而不是怎样产生随机数的问题 [/B]


是这样的, 偶不想产生那么多次随机数, 偶只想产生一个随机数, 用它来代表一个随机的数列, 然后, 偶就用SEQUENCE号把数列里的数算出来,

最简单的方法是从随机数开始取SEQUENCE, 当然这没有解决偶的问题, 最好是连步长都由这个随机数来决定, 这样就不能从前一个主键来推测后一个主键了

论坛徽章:
0
8 [报告]
发表于 2003-12-20 09:29 |只看该作者
恩, 找到了两个算法, 第一个很简单, 但可惜不是随机的, 第二个是典型的伪随机数算法, 可惜要用到2的几百万次方这样巨大的整数, 真痛苦:torture:
要是有UNIX上计算密码的源代码就好了

第一种做法:
f(k) =  (k*F(N-1)) mod F(N)
其中,
k是一个序列号, 就是要取的那个数的顺序号
F(N)是这样一个序列 F(0) = 0, F(1) = 1,  F(N+2) = F(N+1)+F(N) (for N>=0)

第二种做法

       V    = ( ( V  * 2 ) + B .xor. B ... )(Mod 2^n)
        N+1         N         0       2
V是要取的随机数, B是个种子, n是随机数的最大个数

原来这个问题, 很高难, 不少数学高手都为解决这个问题写了论文, 咳咳, 偶真是个白痴 :bad:

论坛徽章:
0
9 [报告]
发表于 2003-12-20 11:33 |只看该作者
搞定了, 真爽!

结合上面两个算法

采用如下计算

F(N)=(随机数*(N+随机数))MOD 一个质数

就会在1-质数的范围内产生一个随机的序列

当然这个序列不够安全, 因为如果知道了算法就总可以通过对取到的主键进行分析, 而得到随机数和质数的值, 但是在不知道算法的情况下, 这是很困难的
对于偶的情况, 这样已经足够勒
:bye:

论坛徽章:
0
10 [报告]
发表于 2003-12-20 16:17 |只看该作者
最初由 lodge 发布
[B]搞定了, 真爽!

结合上面两个算法

采用如下计算

F(N)=(随机数*(N+随机数))MOD 一个质数

就会在1-质数的范围内产生一个随机的序列

当然这个序列不够安全, 因为如果知道了算法就总可以通过对取到的主键进行分析, 而得到随机数和质数的值, 但是在不知道算法的情况下, 这是很困难的
对于偶的情况, 这样已经足够勒
:bye: [/B]


效果怎样啊,能对整个的应用情况和使用说的清楚点吗,让大家分享,能保证不重复吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP