求助彩票算法的实现
1、一注内的n个号码不能重复,位置可以不考虑,但是为了便于查看,建议进行号码排序处理
2、题目的意思是机选产生一注号码,这注号码要在C(m,n)注号码中保持唯一,也就是所说的几百万分之一
3、进一步说就是假如你全包了m个号,也只有一个中大奖(风险控制)
4、机选过程的时间当然是越短越好!!
例如35选7中,选出500万组这样的号码,任意两个都不重复。
问题点数:20、回复次数:3Top
1 楼kyosing(火)回复于 2006-03-02 08:26:27 得分 0
彩票算法:
1 定义int A[33] 用来存放1-33
2 产生一个随机数(0-32之间)i,取出A[i]放到B[1],同时A[i]同A[32]互换
接着产生一个随机数(0-31之间)j,A[j]放到B[2],同时A[j]同A[31]互换
......
2可以用一个很简单的for语句完成同时完成排序
按照上面的算法写程序时,测试后,在10万条组合里就有300多条是重复的,明显不合格,不知道还有什么更好的办法?Top
2 楼kyosing(火)回复于 2006-03-02 15:14:26 得分 0
ASP 写的程序
<%
Const M = 36
Const N = 7
ReDim data(M),c(N)
'Response.write UBound(c) & "," & LBound(c)
'Response.End()
'初始化号码数组
For i = 1 to M
data(i) = i
Next
'排序
Sub BubbleSortNumbers(iArray)
Dim i
Dim k
Dim temp
For i = UBound(iArray) To LBound(iArray) Step -1
For k = LBound(iArray) + 1 To i
If iArray(k - 1) > iArray(k) Then
temp = iArray(k - 1)
iArray(k - 1) = iArray(k)
iArray(k) = temp
End If
Next
Next
End Sub
'生成机选号
Sub MyRand(m1,n1)
Dim i,k,t,temp
Randomize
For k = 1 to n1
t = Int(((m1-k+1) * Rnd) + 1)
c(k) = data(t)
'交换
temp = data(t)
data(t) = data(m1-k+1)
data(m1-k+1) = temp
Next
Call BubbleSortNumbers(c)
'检查重复
For k = 1 to n1 - 1
if c(k) = c(k+1) then
Response.Write "error<br>"
k = n1
end if
Next
End Sub
'输出
Response.write "<table border=1 align=center><tr>"
For i = 1 to M
Response.write "<td>" & i & "</td>"
Next
Response.write "</tr><tr>"
For i = 1 to 10
Call MyRand(M,N)
'输出结果
For k = 1 to c(1) - 1
Response.write "<td> </td>"
Next
Response.write "<td bgcolor=red><font color='#ffffff'>" & c(1) & "</font></td>"
For j = 2 to N
For k = 1 to c(j) - c(j-1) - 1
Response.write "<td> </td>"
Next
Response.write "<td bgcolor=red><font color='#ffffff'>" & c(j) & "</font></td>"
Next
For k = 1 to M - c(N)
Response.write "<td> </td>"
Next
Response.Write "</tr>"
tt = ""
For k = 1 to n1
if tt <> "" then
tt = tt & "," & c(k)
else
tt = c(k)
end if
Next
Response.Flush()
Next
Response.write "</table>"
%>Top
3 楼zoologist(王朝)回复于 2006-03-02 16:21:17 得分 0
http://www.begin.org.cn/pascal/paizu.rarTop




