假设有一个列表List1里面装的是要抽出来的项,有一个文本框Text1来接收
Randomize '初始化随机数种子Dim RandomIndex as Integer '用于保存随机数
Dim Random as new ListBox '便于后台 *** 作
Dim i as Integer 'For循环计数器
For i = 0 To List1.ListCount - 1 '把List1的项添加到Random
Random.AddItem List1.List(i) '为列表添加项
Next i
For i = 0 To Random.ListCount - 1 '随机选中Random的某个项并输出
RandomIndex = Int(((Random.ListCount - 1) - 0 + 1)) * Rnd + 0) '随机产生一个列表索引并存到变量中
Text1.Text = Text1.Text & Random.List(RandomIndex) '输出到文本框
Random.RemoveItem(RandonIndex) '从列表中移除,以免重复
DoEvent '可选,用于防止界面未响应
Next i
另外随机函数有个公式,用来随机出某个范围的整数
Int((范围上限 - 范围下限 + 1) * Rnd + 范围下限)
此程序没有保证所有项被抽中的几率都平等,有两个原因
VB的随机是伪随机
项被从列表移除,项的总数小了,后面的数被抽到的几率会比前面的大
比如说,开始有100个项,那每个项被抽到的几率都是1/100
到后来,项被移除,剩下50个项,那么每个项被抽到的几率就变成了1/50
仅供参考
求采纳,谢谢~
Option Explicit
'号码抽奖机制作
'百度Hi - pivotstar 原创代码,尚未修饰,请指教。
Dim A() As String, n As Integer '全程 n 值不要有其他再归零的赋值(公平值)
Private Sub Command1_Click()
Dim i As Integer, j As Integer, tmp As String
'建立人数范围
'只需要运行一次,直到抽奖过程全部完毕,所以不再给点击。
Command1.Enabled = False
Erase A
ReDim A(Int(Val(Text1.Text) - 1))
For i = LBound(A) To UBound(A)
A(i) = Right(String(Len(Text1.Text), "0") & CStr(i + 1), Len(CStr(Val(Text1.Text))))
Next i
'打乱排序
For i = LBound(A) To UBound(A)
j = (UBound(A) - i) * Rnd + i
If i <> j Then
tmp = A(i)
A(i) = A(j)
A(j) = tmp
End If
Next i
'填入List1(因为一般抽奖不能重复得奖,已得奖者从List1列表移除)
For i = LBound(A) To UBound(A)
List1.AddItem A(i)
Next i
Label1.Caption = String(Len(Text1.Text), "0")
' 给 n 一个随机值
n = Int(Rnd * (List1.ListCount)) '随机取值0至(人数减1)
'开始等候启动【开始抽奖】按钮
End Sub
Private Sub Command2_Click()
'开始计时抽奖
If List1.ListCount = 0 Then Exit Sub
Timer2.Interval = 10 '计数300次为3秒(3秒有点少,刺激度不够)
'这里也可以给 n 指定一个随机值
Timer1.Interval = Int((111 - 82 + 1) * Rnd + 82) '随机取值82毫秒至111毫秒
Timer1.Enabled = True
Timer2.Enabled = True
Command2.Enabled = False
Command3.Enabled = True
End Sub
Private Sub Command3_Click()
'奖号已经开出,领奖动作。
' n 值是停留在 n
Command3.Enabled = False
MsgBox "核对领奖者是不是 " & List1.List(n)
'把该领奖者从列表中移除或另外保存文件
List1.RemoveItem (n)
If List1.ListCount = 0 Then
MsgBox "抽奖完毕"
'这里把窗口重新整理为启动初始值,或关闭程序。
Exit Sub
End If
'接着启动下一次【开始抽奖】按钮
Command2.Enabled = True
End Sub
Private Sub Form_Load()
Timer1.Enabled = False
'假设有1200人
Text1.Text = "1200"
Label1.Caption = String(Len(Text1.Text), "0")
ReDim A(0) '便于Erase指令不出错
End Sub
Private Sub Text1_Change()
Label1.Caption = String(Len(CStr(Val(Text1.Text))), "0")
End Sub
Private Sub Timer1_Timer()
n = n + 1
If n >= List1.ListCount Then n = 0
Label1.Caption = List1.List(n)
Label1.Refresh
End Sub
Private Sub Timer2_Timer()
Static k As Integer
k = k + 1
If k >= 300 Then '3秒自动停止
Timer1.Enabled = False
Timer2.Enabled = False
k = 0
End If
End Sub
'附注:
'使用2个Timer不使用Do...Doevents .3000ms..Loop 循环计时三秒(避免窗口卡卡)
'经CPU资源测试,采用2个Timer模式。占用CPU资源比Do...Doevents...Loop 少。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)