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

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

我的想法是用时间+随机数组成16位,(前提时间肯定不能改)不知是否可行,理论上是否肯定与以前的不会重复??
...全文
407 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
这是老师做过的一个项目,抽取了当中核心之一的内容给大家试试,有些难度。 1、实验目的 1)掌握C#命令行参数的接收; 2)掌握C#中的泛型用法; 3)掌握C#的基本流程语句; 4)掌握C#的随机数生成; 5)了解C#的异常处理流程; 6)掌握C#的计时器及对代码的性能优化。 7)本实验注重算法实现,在实现功能的前提下,尽量优化计算速度。 2、实验要 这是一个实际的项目衍生出来的核心算法之一。防伪码是我们现在经常在商品上看到的防伪手段之一,现在需要编写一个防伪码生成器,按照输入参数生成防伪码,并且把生成的时间及指定的防伪码输出。 1)防伪码的组成 防伪码由以下字符组成:0123456789ABCDEFGHJKLMNPQRSTUVWXYZ (数字1和字母I相近、数字0和字母O相近,所以去掉字母I和字母O。全部字母大写) \ 2)在命令行中输入2个参数,分别是: 防伪码长度 防伪码个数 例如:在命令行中调用程序为:学号.exe 10 10000 指的是防伪码长度为10生成10000个防伪码。 3)防伪码的生成及注意事项 防伪码的长度由命令行参数决定; 所生成的防伪码不能重复(按照以上例子,生成10000个防伪码,这10000个防伪码就肯定不能重复)。 3、提交内容 1)请把整个项目源代码压缩为RAR文件进行提交 2)运行: a) exe 10 10000 b) exe 20 1000000 c) exe 50 1000000 (即防伪码长度为1010000个;长度为20,一百个;长度为50,一百个)共三个测试用例,记下时间,贴在“自评备注”中,格式如下: a) 时间;b) 时间;c) 时间 下面可以写写自己的感想等 4、实验评分 程序能运行,按照全部要实现:A及以上 程序能运行,但有Bug的(指生成重复的防伪码等):B 程序不能运行,但有思路的:C及以下 0:发现抄袭行为,本次实验0分,累计两次,平时成绩0分。 额外要:代码命名必须有一定规范、代码格式必须靓仔,歪歪扭扭的扣分。 5、采用的函数及思路 1)开发时,在解决方案中,鼠标右键选择项目,然后点选“属性”,在“调试”项目中的“命令行参数”里面,可以预先输入需在命令行接收的参数,这样开发的时候就可以直接读入了。注意,不用对这些参数进行校验,默认输入的都是正确的参数,注意程序运行时的异常处理。 2)程序运行计时 在最上面加入using System.Diagnostics; 在程序头加入: Stopwatch timer1 = new Stopwatch();//计时器类 timer1.Start();//开始计时 在程序最尾加入: timer1.Stop();//停止计时 double dMilliseconds = timer1.Elapsed.TotalMilliseconds; Console.WriteLine("生成个数为:{0},运行时间为:{1}", icount, dMillisecondes); Console.ReadKey(); Stopwatch是C#一个类似秒表的东西,用来计算程序的运行时间,注意,必须按照要,计时器在程序运行时就要开启,在结束时停止并输出结果,不能放置在其他地方。 3)防伪码生成思路 例如,有以下定义: string strTableChar = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"; 生成一个从0到strTableChar.Length的数字a,然后使用strTableChar[a]就可以随机返回一个字母,重复n次(n等于防伪码的长度),这样就可以组合到一串随机字符串,也就是防伪码了。 6、思路及技巧 1)随机数生成:种子的选择问题,可用默认的、GUID、RNGCryptoServiceProvider等等作为随机数种子…… 2)怎么样保证,新生成的防伪码和以生成的防伪码有没有重复? 3)stringBuilder的用法,试试用string和stringBuilder有什么不同?听听老师的课…… 4)多次运行程序后,会不会发现程序运行速度会加快?看看这里:《告诉一个不一样的.NET Framework字符串驻留》,另外也可以找找对应.NET Framework底层实现的文章。

7,785

社区成员

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

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