您的位置:寻梦网首页编程乐园ASP编程>ASP 如何取出n个不重复的随机数
ASP世界
ASP 如何取出n个不重复的随机数
作者:Greatshi  原创

思路:定义一个数组,给出取值范围,再将数组随机打乱次序,再取出其中n个。

本例从0~99中随机取出6个不重复的随机数。


<%
Dim t(99), n
n=6
for i=0 to 99
  t(i)=i
next

leng=UBound(t)

'随机排序
randomize
for ii=0 to leng-1
  b=int(rnd()*leng)
  temp=t(b)
  t(b)=t(ii)
  t(ii)=temp
Next

For i=0 To n
  response.write t(i)&"<br>"
next
%>

下面例子是百度知道上一位网友提出的问题,即,随机选择一二三四五六七中的2个(不重复的)数字组成一组。共20组,同时对20组中一二三四五六七出现的概率进行进行统计显示也面如下

-----------------------------------------

本次随机次数20次 (中文显示的)
1. 一三
2. 四五
3. 一七
.......

统计结果(最多的要排在前面)

七 18次
二 10次
,,,,

思路:将数组随机打乱次序,再取出其中两个,本例取前两个数,绝对随机,不会有“一一”、“六六”之类的重复数据

<%
dim list_no:list_no=20
dim a:a=array("一","二","三","四","五","六","七")
'a=Split("一,二,三,四,五,六,七",",")
dim n,i,j,c(6)
for i=0 to 6
c(i)=0 '初始化统计数
next
%>
本次随机次数<%=list_no%>次 (要中文显示的)<br><br>

<%
leng=UBound(a)
n=0
do while n<list_no
'随机排序
randomize
for i=0 to leng
d=int(rnd()*leng)
temp=a(d)
a(d)=a(i)
a(i)=temp
temp=c(d)
c(d)=c(i)
c(i)=temp
Next
'取出随机排序后的前两个数,作为一组随机数
c(0)=c(0)+1
c(1)=c(1)+1
response.write n+1&". "&a(0)&" "&a(1)&"<br>"
n=n+1
loop

%>
<br>统计结果(最多的要排在前面)<br><br>
<%
for i=0 to UBound(c)-1
for j=i+1 to UBound(c)
if c(i)<c(j) then
temp=a(i)
a(i)=a(j)
a(j)=temp
temp=c(i)
c(i)=c(j)
c(j)=temp
end if
next
next
for i=0 to 6
response.write a(i)&" "&c(i)&"次<br>"
next
%>

上面方案,需要进行7次循环。每一组绝对不会有“一一”“二二”之类的重复数据,但可能有两组或多组重复的情况。例如本次运行就出现三次“六七”,但楼主似乎并没有这种限制。
如果楼主要求不同组间也不能重复,则可用下面方案,但总共只有42种可能,也就是说最多只能有42组数据。这个方案需要进行42次循环.

思路:列出所有42种可能组合,将数组随机打乱次序,再取出数据,要n组就将list_no设为n,n的取值范围是 1~42 ,最多42组,绝对随机,不会重复数据
<%
dim list_no:list_no=20 '随机次数, 1-42,
dim a:a=array("一","二","三","四","五","六","七")
dim n,i,j,b(6),c(6),r(41,1)
for i=0 to 6
b(i)=i
c(i)=0
next
%>
本次随机次数<%=list_no%>次 (要中文显示的)<br><br>

<%
'列出所有42种可能组合
n=0
for i=0 to 6
for j=0 to 6
if i<>j then
r(n,0)=i
r(n,1)=j
n=n+1
end if
next
next

'随机排序
randomize
for i=0 to UBound(r)
d=int(rnd()*UBound(r))
temp0=r(d,0)
r(d,0)=r(i,0)
r(i,0)=temp0
temp1=r(d,1)
r(d,1)=r(i,1)
r(i,1)=temp1
Next
'列出结果
for j=0 to list_no-1
c(r(j,0))=c(r(j,0))+1
c(r(j,1))=c(r(j,1))+1
response.write j+1&". "&a(r(j,0))&" "&a(r(j,1))&"<br>"
next

%>
<br>统计结果(最多的要排在前面)<br><br>
<%
for i=0 to UBound(c)-1
for j=i+1 to UBound(c)
if c(i)<c(j) then
temp=a(i)
a(i)=a(j)
a(j)=temp
temp2=c(i)
c(i)=c(j)
c(j)=temp2
end if
next
next
for i=0 to 6
response.write a(i)&" "&c(i)&"次<br>"
next

%>

当然,也可以用类似方案1的办法,加一个是否有重复的判断,但是,随机取数次数小时没问题,当随机取数次数接近42时,循环量相当大:

<%
dim random_no(19,1),n,i,j,c(6)
dim a:a=array("一","二","三","四","五","六","七")
for i=0 to 6
c(i)=0
next
%>
本次随机次数<%=UBound(random_no)+1%>次 (要中文显示的)<br><br>

<%
leng=UBound(a)

n=0
m=0
is_repeat=0

do while n<=UBound(random_no)
'随机排序
randomize
for i=0 to leng
d=int(rnd()*leng)
temp=a(d)
a(d)=a(i)
a(i)=temp
temp=c(d)
c(d)=c(i)
c(i)=temp
Next
'取出随机排序后的前两个数
random_no(n,0)=a(0)
random_no(n,1)=a(1)

'判断是否有重复
if n>0 then
for j=0 to n-1
if random_no(n,0)=random_no(j,0) and random_no(n,1)=random_no(j,1) then
is_repeat=1
exit For
end if
next
end if

if is_repeat<>1 then
c(0)=c(0)+1
c(1)=c(1)+1
response.write n+1&". "&a(0)&" "&a(1)&"<br>"
n=n+1
end if
m=m+1
is_repeat=0
loop


%>
<br>统计结果(最多的要排在前面)<br><br>
<%
for i=0 to UBound(c)-1
for j=i+1 to UBound(c)
if c(i)<c(j) then
temp=a(i)
a(i)=a(j)
a(j)=temp
temp2=c(i)
c(i)=c(j)
c(j)=temp2
end if
next
next
for i=0 to 6
response.write a(i)&" "&c(i)&"次<br>"
next
response.write "m= "&m&"次<br>"

%>