破釜沉舟论坛 » WEB 开发 » 各位高手请急救`~!ASP如何生成任意数~!?

2006-6-2 15:14 zhangsent
各位高手请急救`~!ASP如何生成任意数~!?

  各位高手请急救`~!ASP如何生成任意数~!?
就是说,如何用ASP生成多位随机码`!?

2006-6-2 17:06 祥子
Random(9999)?

2006-6-2 22:50 zhangsent
想生成一组不能重复的16位随机数据

2006-6-4 21:34 xiaocao-x
这个就比较麻烦了。恐怕不能用简单的几行代码就解决问题的。我想你需要对比每一个生成的随机数,如果遇到相同的就重新取数。

2006-6-4 21:36 祥子
没有那个必要吧。
GUID也是这样生成的16位随机数。
16位,从实际上来说,不可能存在有重复的。机率太小

2006-6-5 08:46 xiaocao-x
asp如何生成GUID这个我到是没试过。

2006-6-5 08:59 祥子
ASP里面应该不会用到GUID吧。

2006-6-5 09:35 zhangsent
已经生成了,但是不知道有没有相同的数据,代码如下:
[code]
i=1
do while i<21'(循环生成的次数,即生成个数)
randomize
rnumber=INT((999999999999-45343496675+100)*RND+100000000000)
if rnumber<1000000000000 then
response.Write rnumber&"   "
if i mod 8=0 then
response.Write"<br>"
end if
i=i+1
end if
loop
[/code]
都是生成12位的随机数,但是应该是没有相同的,因为有[color=red]randomize[/color]的存在,使数字都随机化了,相同的情况和机率都很小大约在:0.045%左右

2006-6-5 14:55 zhangsent
[quote][b]引用第3楼[i]xiaocao-x[/i]于[i]2006-06-04 21:34[/i]发表的“”[/b]:
这个就比较麻烦了。恐怕不能用简单的几行代码就解决问题的。我想你需要对比每一个生成的随机数,如果遇到相同的就重新取数。[/quote]
没错,就跟你说的一样,现在我写了如下的代码:
[code]
1=1
i<200001
randomize
rnumber=INT((999999999999-45343496675+100)*RND+100000000000)
sql2="select * from db where fwma='"&rnumber&"'"
set rs2=server.CreateObject("adodb.recordset")
rs2.open sql2,conn,1,1
if rnumber<1000000000000 and not rs2.eof then
response.Write rnumber&"   "
if i mod 8=0 then
response.Write"<br>"
end if
sql="insert into db(fwma,proname,pihao) values ('"&rnumber&"','"&proname&"','"&pihao&"')"
conn.execute sql
i=i+1
end if
loop
[/code]
在每一次写入数据的时候都先检查一次,就保证了不会重复,但是现在的问题就是:这样做,运行的效率特别的慢。
有那位可以帮帮忙~!!! [s:4]  [s:3]  [s:3]

2006-6-5 16:39 祥子
都说了,没有必要判断。
生成随机数的时候。用16进制的。
16位16进制的数重复的机率为1/2^128约等于0

你这样去判断,大大降低了程序的执行效率

2006-6-6 08:13 zhangsent
[quote][b]引用第9楼[i]祥子[/i]于[i]2006-06-05 16:39[/i]发表的“”[/b]:
都说了,没有必要判断。
生成随机数的时候。用16进制的。
16位16进制的数重复的机率为1/2^128约等于0

你这样去判断,大大降低了程序的执行效率[/quote]
我用过了,生成20万个的时候相同的几率就是0.0046%,大约有800多个。
现在在想,有没有其他的方法,就是说用其他的语言来写,能快点吗`!??
VB??

2006-6-6 09:38 xiaocao-x
[s:8] 楼主好像在做一个很大的应用。那用的应该至少是SQLserver数据库吧。是SQLserver数据库的话那就自带了GUID生成器了。不必要那么麻烦了。

2006-6-6 11:54 祥子
[quote][b]引用第10楼[i]zhangsent[/i]于[i]2006-06-06 08:13[/i]发表的“”[/b]:

我用过了,生成20万个的时候相同的几率就是0.0046%,大约有800多个。
现在在想,有没有其他的方法,就是说用其他的语言来写,能快点吗`!??
VB??[/quote]

你的生成方法不对,我给你一个PASCAL的例子。我对ASP不熟,你自己去改写。

function GetRmdNumber: Int64; //返回结果的64位的Int型
const
   MAX_NUMBER = $FFFFFFFFFFFFFFFF; //最大的随机数,16进制
begin
   System.Randomize;  //初始化随机种子
   Result := System.Random(MAX_NUMBER); //产生随机数
end;

2006-6-6 13:58 zhangsent
[quote][b]引用第11楼[i]xiaocao-x[/i]于[i]2006-06-06 09:38[/i]发表的“”[/b]:
[s:8] 楼主好像在做一个很大的应用。那用的应该至少是SQLserver数据库吧。是SQLserver数据库的话那就自带了GUID生成器了。不必要那么麻烦了。[/quote]
没错是一个应用来的,因为只要数字,不要英文字母,所以比较烦~!
我想过用时间来生成,就是用时间time()和month(),去掉多余的部分,再跟我的rnd相乘,就可以得肯定不相同的数字,因为在生成的时间肯定是不同的,而且由于randomize的存在,使rnd每一次都不相同,所以在生成20万个随机数的时间段内应该是不存在相同的数据。但是实现起来好象有点不妥,每一次都要去取时间来生成数据,使速度又变慢了`!
祥子,想问问如果用GUID来生成是不是一定不会有重复的`!?

2006-6-6 19:54 祥子
理论上有,但实际中不可能出现重复

2006-6-6 20:14 祥子
[quote][b]引用第12楼[i]祥子[/i]于[i]2006-06-06 11:54[/i]发表的“”[/b]:


你的生成方法不对,我给你一个PASCAL的例子。我对ASP不熟,你自己去改写。

function GetRmdNumber: Int64; //返回结果的64位的Int型
.......[/quote]


函数有问题。得改一下。

//GUID的格式: XXXX-XXXXXXXX-XXXX
//这里模仿生成GUID
//因为GUID转为整形将溢出,所以改为字符串输出
//INT类型最大的值只有2^63。所以16^16会溢出。
//使用三段随机数组成。
function GetMyGUID: string;
const
   RDM1 = $FFFF;
   RDM2 = $FFFFFFFF;
   RDM3 = $FFFF;
var
   S1, S2, S3: string;
begin
   System.Randomize;
   //以十六进制输出,位数为4位
   S1 := IntToHex(System.Random(RDM1), 4);
   //以十六进制输出,位数为8位
   S2 := IntToHex(System.Random(RDM2), 8);
   //以十六进制输出,位数为4位
   S3 := IntToHex(System.Random(RDM3), 4);
   Result := S1 + '-' + S2 + '-' + S3;
end;

2006-6-6 22:11 zhangsent
[color=red]ASP脚本生成GUID的实现[/color]
[code]<%

Dim objTypeLib

Set objTypeLib = CreateObject("Scriptlet.TypeLib")

Response.Write objTypeLib.Guid

%>
[/code]

2006-6-7 02:31 祥子
我用我的方法做了200000个GUID的比较,结果如上图所示:

2006-6-7 08:23 zhangsent
祥子,高手啊`!
但是我只要数字,不要英文。把GUID里多余的"-"和英文去掉之后,可能还会有相同的情况出现,先试试。

2006-6-7 09:52 祥子
你是要我写个DLL给你还是怎么?
数字会溢出,只能用字符串输出

页: [1] 2


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.