您的位置:程序门 -> 专题开发/技术/项目 -> 数据结构与算法



求一个数学算法,用于根据给定值生成尽可能不重复的数值序列


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


求一个数学算法,用于根据给定值生成尽可能不重复的数值序列[已结贴,结贴人:xlander]
发表于:2007-01-04 15:24:04 楼主
假设有输入序列,1,2,3,4,5,6,7,8,9,10...n
要求输出一个类似随机数的序列,没有任何规律
比方说,234,78,123,87,32,...
输出的序列可以重复,但要求重复几率尽可能低,最好不要大于5%

不要使用现成的随机函数如rand()
发表于:2007-01-04 15:39:271楼 得分:0
不明白楼主说的输入1到n,是做什么用的
发表于:2007-01-04 15:45:382楼 得分:0
看看这个:
1,2,3,4,5,6,7,8,9,10
对应的输出是:
6,15,28,45,66,91,120,153,190,231

看看有什么规律么?
发表于:2007-01-04 15:49:253楼 得分:0
其实也没什么大用。哈哈。
我现在想用在共享软件序列号的发放里面。

就是做一下变换,让人不能根据若干输入和结果,猜测算法。

发表于:2007-01-04 16:05:104楼 得分:33
an   =   2*n*n+3*n+1

如果是少量的话,倒是可以用一下系统时间的最后3位(xxx微秒),或者随便从哪里读一段二进制数据来(硬盘,内存,文件...稍微有些规律应该也没关系),处理一下就凑合着用了
发表于:2007-01-04 16:47:585楼 得分:33
md5转换一下
发表于:2007-01-04 18:42:466楼 得分:0
fosjos(无聊的菜鸟程序员)
你怎么推出来的?
发表于:2007-01-05 11:06:337楼 得分:34
先看看你的序列为何如此脆弱

f(1)   =   6,   f(2)   =   15,   f(3)   =   28,   f(4)   =   45   ....
 
==>   f(2)-f(1)   =   9;   f(3)-f(2)   =   13   ;   f(4)-f(3)   =   17;   f(5)-f(4)   =   21   ...
=>   13-9   =   4,   17-13   =   4,   21-17   =   4   ....   显然是一个等差数列

=>   f(n)-f(n-1)   =   4(n-1)+5   (n> 1).   由此递推关系,就可以得出结果了。

推倒如下:
f(2)-   f(1)   =   4*1+5   ;
f(3)-   f(2)   =   4*2+5;
f(4)-   f(3)   =   4*3+5;
...
f(n)-f(n-1)   =   4*(n-1)+5;
将上面的各式相加   =>   f(n)-f(1)   =   2n*n   +3n-5,   注意到   f(1)   =   6.
所以   f(n)   =   2n*n+3n+1

就你的需求而言,你需要一个非线性的伪随机书发生器。一个简单的办法是自己定义一个大的表格,里面的数据是预先定义,随即并且是非线性的(发挥自己的想象:))。
然后用rand(n),(n=1,2,...)产生一个数,用这个数的偶数位确定行,奇数位确定列,然后取出表格中的值即可。

这个办法的关键是这个表格的内容必须是安全的,如果别人反汇编,这个方法是徒劳的...

如果你对安全需要的很高,那么你需要的是密码学安全的伪随机数发生器,你可以上网搜索   prng,有不少现成的实现(大部分是国外的密码学专家写的),可以保证国家安全局拿你的程序也没办法。


快速检索

最新资讯
热门点击