每天生成10万随机数,求思路

syalan 2010-05-27 05:14:11
每天需要生成10万 16位的随机数,全由数字组成,每天生成的以及与之前的都不能重复,求思路!

我的想法是用时间+随机数组成16位,(前提时间肯定不能改)不知是否可行,理论上是否肯定与以前的不会重复??
...全文
382 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2010-06-01
  • 打赏
  • 举报
回复

任何试图通过简单运算的随机数生成方法,都使随机性下降。

每日生成随机数前,调用:

Randomize (Now())
xucome 2010-06-01
  • 打赏
  • 举报
回复
学习了
csjcsj1234 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 huaxiamengqing 的回复:]
以上的前提是你电脑一直开着,不能关机,嘿嘿,没看到你说每天都不能重复,为何要每天生成那么多呢?想要多少随机数一次生成不就行了嘛,不拉解
[/Quote]
同样的困惑
huaxiamengqing 2010-05-31
  • 打赏
  • 举报
回复
以上的前提是你电脑一直开着,不能关机,嘿嘿,没看到你说每天都不能重复,为何要每天生成那么多呢?想要多少随机数一次生成不就行了嘛,不拉解
huaxiamengqing 2010-05-31
  • 打赏
  • 举报
回复
我以前想过一种生成随机数的方法,就是调用句柄,系统分配给程序的句柄,每次调用都不会有重复的,具体做法,呵呵,你们不要笑呀,创建4个按钮数组,数组上限为25000,即一次性load 10万个按钮,而这10万个按钮对应的句柄是不会有重复的,句柄补0补足16位不会有重复的,或者操作一下代码10万次,也不会有重复的
Private Sub Command2_Click()
Load Command1(1)
MsgBox Command1(1).hWnd
Unload Command1(1)
End Sub
  • 打赏
  • 举报
回复
这要看具体使用情况了,如果生成的频率不是很快,每次中间执行了其它事务,能保证不会在一毫秒里出现多个结果的话,上面的方法完全可行。

但如果是别的不干,或者干得很少,几乎就是连续生成随机数的话,则上面方法有可能重复。

16位数本身范围很大,看来足够用,但如果用日期时间来生成,反而大大限制了这16位数实际的利用率——至少它已经不可能使用从0到2009后接12位数的范围,也不可能出现2040后接12位数以上的范围(一般的程序不可能持续使用超过30年)。同样道理,在这个已经受限的范围里,还要再次受限于程序运行时段的影响,因为程序不会用足足一天24小时去运行,只能运行几小时甚至只是一小时,所以并不能最大化利用一天24小时的每分每秒。如果以一小时为准,按照上面方案,实际只能产生360秒*2位数毫秒=36000个数,即3万6千个,满足不了十万的要求,除非能够保证至少运行三个小时并保证每毫秒最多只生成一个随机数。

显然这种方案局限性很大,对于快速运算,和整体过程不超过半小时这样的情况就不适用了。

若想制定其它方案,并保证速度能尽量快,有方便的办法,有复杂的办法,还要看这个随机数是干什么用的。最好楼主说明一下吧,免得做无用功。
僵哥 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 chewinggum 的回复:]
Dim a As Currency
Dim i As Integer
For i = 1 To 100000
a = a + Rnd() * 100
Debug.Print Format(a, "000000000000000")
DoEvents
Next

循环一次一天的的10万就完成了,完成以后把a保存一下,第二天接着累加,保证不重复
[/Quote]

The Rnd function returns a value less than 1 but greater than or equal to 0. The value of number determines how Rnd generates a random number:
脆皮大雪糕 2010-05-31
  • 打赏
  • 举报
回复
Dim a As Currency
Dim i As Integer
For i = 1 To 100000
a = a + Rnd() * 100
Debug.Print Format(a, "000000000000000")
DoEvents
Next

循环一次一天的的10万就完成了,完成以后把a保存一下,第二天接着累加,保证不重复
huaxiamengqing 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gcaufy 的回复:]
now()+Int((100000000) * Rnd)
不会有重复的
[/Quote]
不会有才怪
gcaufy 2010-05-31
  • 打赏
  • 举报
回复
now()+Int((100000000) * Rnd)
不会有重复的
赵4老师 2010-05-28
  • 打赏
  • 举报
回复
如果电脑时间被修改,还是会重复的。
更稳妥的方法是把生成的随机数放在一个添加了唯一值约束的数据库表中,添加成功说明没重复,失败说明重复,重新生成直到添加成功为止,如果重新生成的次数超过100次,中断并告警。
熊孩子开学喽 2010-05-28
  • 打赏
  • 举报
回复
用时间就可以了, YYYYMMDDhhmmss 年月日时分秒才用掉12位, 毫秒有3位,取两位, 一共16位,应该够了
chinaboyzyq 2010-05-28
  • 打赏
  • 举报
回复
16位的随机,每天10万个

1000000000000000/100000/365=做以做到你这一生肯定赶不上重复的那一天。
luofenghen 2010-05-28
  • 打赏
  • 举报
回复
月 日 09:01:01.111 时分秒毫秒 肯定不重复
僵哥 2010-05-27
  • 打赏
  • 举报
回复
提供一个最为简单的伪随机数处理方法:
年月日取八位:yyyymmdd
对于16位的数值来说,就还有8位,其最大范围是:0~99999999,然后在此区间取随机数M和N,当 |M-N|>100000时有效,然后在 1 到 |M-N|\100000 之间取随机数作为步长T,然后从M到N之间按步长T取100000个伪随机数,不足8位长度补前导0,最后得到 xxxxxxxx
最终按:yxyxyxyxmxmxdxdx组成的便是一个16位每天都不会重复的伪随机数
僵哥 2010-05-27
  • 打赏
  • 举报
回复
guyehanxinlei 2010-05-27
  • 打赏
  • 举报
回复
简单的随机与时间结合使用频率还是很多的,比如流水号之类的东西.
楼上所说的GUID道是不错的选择.
threenewbee 2010-05-27
  • 打赏
  • 举报
回复
用guid

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧