怎样用VB语言设计一个抽号机

怎样用VB语言设计一个抽号机,第1张

假设有一个列表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 少。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11036028.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存