首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-03-03 
求一个数学算法,用于根据给定值生成尽可能不重复的数值序列假设有输入序列,1,2,3,4,5,6,7,8,9,10...n要求

求一个数学算法,用于根据给定值生成尽可能不重复的数值序列
假设有输入序列,1,2,3,4,5,6,7,8,9,10...n
要求输出一个类似随机数的序列,没有任何规律
比方说,234,78,123,87,32,...
输出的序列可以重复,但要求重复几率尽可能低,最好不要大于5%

不要使用现成的随机函数如rand()


[解决办法]
An = 2*n*n+3*n+1

如果是少量的话,倒是可以用一下系统时间的最后3位(xxx微秒),或者随便从哪里读一段二进制数据来(硬盘,内存,文件...稍微有些规律应该也没关系),处理一下就凑合着用了
[解决办法]
md5转换一下
[解决办法]
先看看你的序列为何如此脆弱

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,有不少现成的实现(大部分是国外的密码学专家写的),可以保证国家安全局拿你的程序也没办法。

热点排行