昨天在这里发一个生成10位随机数的帖子  (原帖 http://topic.csdn.net/u/20100917/14/3d845be8-e479-46d1-85ea-b957be702cdf.html)很感谢各位的解答~但是还是有几个问题不明白1.先撇开位数的限制(指生成的随机数的长度),如果是6位随机数加上时间戳的组合作为随机数,仍然实现不了永不重复吗?
本来时间戳就是永不相同的,例如201009181234 这样~把这个时间使用MD5加密作为时间戳,不就可以实现永不重复了吗?2.如果是用Guid生成随机数,然后去掉"-"符号,截取其中10位,仍然会不重复的吗?3.如果10位实现不了,请问至少需要多少位?(这里也是指随机数的长度)
谢谢啦!~

解决方案 »

  1.   

    时间戳可以永不相同,但限定10位的时间戳一定会有用完的时候。任何限定位数的东西一定不能永不相同。这包括GUID,它也只是在概率上永不相同,在实际应用上也就认为是不重复的。
      

  2.   

    return Guid.NewGuid().ToString();
      

  3.   

    给定的序列(无论是数字、GUID还是什么),如果随机产生(严格地说,计算机产生的随机是伪随机,但是可以当作随机数),请找一本高中数学课本,以及一只科学计算器,花10分钟,就可以算出这个概率。
      

  4.   

    按抽屉原则,当数据大于规定数量时绝对会重复这这种问题是看规模的,比如银行的流水单号,xxxxxx_日期_000001
    可以看得到他们的处理方式,他们是把数据分解成几部分来处理滴前缀通常是 按业务,按地区的编码
    中缀通常是日期
    后缀通常是流水编号,此处000001 表明当天该地区,该业务至少可以产生999999条记录
     
      

  5.   

    用时间可以实现永不重复,但是现有的编程语言没有提供这种类型的数据结构,也就是说现有的编程语言提供的数据结构都是有精度限制的,只要有精度限制就不可能满足永不重复。用long型的数据完全可以满足你的要求了吧,DateTime.Ticks你用这个试试吧。不过是有序数字。
    DateTime.Ticks:每个计时周期表示一百纳秒,即一千万分之一秒。1 毫秒内有 10,000 个计时周期。此属性的值表示自 0001 年 1 月 1 日午夜 12:00:00(表示 DateTime.MinValue)以来经过的以 100 纳秒为间隔的间隔数。
      

  6.   

    永不相同的随机数:
    1,任何时间,从宇宙诞生到宇宙灭亡
    2,任何地点,本机,互联网连接的机器,太阳系,比如火星上的火星车,全宇宙虽然现在人类还没有飞出太阳系
    这样的随机数有,就是Guid,这个数的大小是2^128次方,需要占16个字节