创造一个完全不可能重复的整数(以更新公式说明部分)

来源:互联网 发布:网络视频会议软件 编辑:程序博客网 时间:2024/05/18 22:40
    考虑到某些直接需要结果的读者,我把结果公布在最前面(以下针对当前时间):
    [(秒*分-秒+毫秒)*时-(秒*分-秒)]*天在一年中的位置 - 年
    注:天在一年中的位置=今天是一年中的第几天  

    首先,我先举个例子,.net中的Random类提供了重载的构造函数,Random()和Random(int),后者的参数为一个种子,Random使用这个种子来生成伪随机数,理论上来说如果种子是不同的,Random可以生成相当随机的数字,如果参数为空.net会使用当前时间当做种子。
    这时,如果有一个方法可以提供很大程度上不同的数字,就可以保证Random生成的数有相当程度的随机性,当然.net已经帮我们做了这件事,我们可以使用Random()构造函数,但是我们可以借助Random来讨论一下本文的主题。
    .ner使用的是时间算法,这是一个相当好的解决方案,我们也可以参考这个方法。
  1. 首先讨论使用秒,构造Random(DateTime.Now.Second),测试这个对象就可以发现,生成10个有10个不同的随机数的数组,这样随机性是很弱的,在一秒内10个数组是完全一样的,可以推测如果连续生成10分钟的话,有多少种重合。
  2. 使用毫秒,这样的意义和秒差不多,生成的随机数间隔变成了毫秒,但是10秒内有多少个重复的毫秒大家可以想到,在推测到10分钟也是不能满足要求的。
    同理,可知单独使用任何一个时间都是不能满足要求的。所以,需要一个公式,公式需要在一个很小的时间单位和一个很大的时间周期中,不会出现重复的结果。
    解释一下上面提到的公式,首先使用当前的秒乘以分,可以得出一个数字,比如12分13秒,4分4秒,2分8秒,8分2秒,结果分别是156,16,16,16,后三者的结果是相同的,这是减去秒数,就变成了143,12,6,14,这样后三者就出现了变化,采用(秒*分-秒)的算法可以消除后三者这样类似时间的影响。把这个结果加上毫秒,就可以把这个数的生成间隔缩小到以毫秒为单位。
    同理,下一本采用类似的方法乘以小时,再减去,就可以把时间周期放大的小时。天在一年中的位置是唯一的,那么乘上这个就得出了一年中唯一的一个数,再减去年份,就可以排除两年中可能相同的时间。
    这种算法的问题在于,前面的计算理论上虽然每步的结果都是不同的,有可能在复合运算是产生相同的结果,但是由于有毫秒这个变量存在,把这种可能缩小到了可以忽略的地步上。