和你说的基本类似。首先初始化数组a(1 To 1000)。比方说,有1个一等奖,那么数组中有1个元素值为1;有10个二等奖,数组中就有10个元素值为2……没有奖可以设为0。放的位置无所谓,不影响概率。记N=1000。 第一个人来抽奖,在1~N范围内产生一个随机数t,看元素a[t]的值就可以知道是否中奖。然后将a[t]与队尾的a[N]交换,之后N值减一,变为999; 第二个人来抽奖,同样在1~N(注意这时N=999)范围内产生一个随机数t,根据a[t]判断是否中奖。然后再将a[t]与队尾的a[N]交换,N值减一; …… 如此循环直到N=0,所有人抽奖完毕.
这个问题好解决! 我一直都用这样的办法:list控件:先向list内写入范围[这个题目的范围是1-1000]For i = 1 To 1000 List1.AddItem i Next i然后从这个范围内随机获取某一个项目 获得了以后记得干掉获取的项目,那样就不会有 下次获取同样项目值的事情发生了我一直把list 当数组用. 好处是数组的元素可以把它干掉所以LZ 的题目可以这样写写看:=============cike例题========== name=随机抽奖 form=command1+list1 步骤: 放入command1 和 list1 到 form1中贴入代码 运行既可 ================================Private Sub Command1_Click() RandomizeFor i = 1 To 4 For j = 1 To i a = Int(Rnd * List1.ListCount) Print i & "等奖" & i & "名,号码为:" & List1.List(a) List1.RemoveItem a Next j Next i
End SubPrivate Sub Form_Load() For i = 1 To 1000 List1.AddItem i Next i End Sub
这问题比较简单,写一段代码给你参考吧,可以立即测试Dim a As Variant Dim b As VariantPrivate Sub Command1_Click() getAward a, "一等奖" For i = LBound(b) To UBound(b) Print b(i) '打印到窗口 Next i End Sub Private Sub Form_Load() ReDim a(1000) As Variant ReDim b(0) As Variant For i = 1 To 1000 a(i) = "人名" & i Next i End Sub '抽奖程序 Sub getAward(pAry, gStr) Dim p, hd As Boolean Do Until hd Randomize p = Int((UBound(a) - LBound(a)) * Rnd + LBound(a)) '随机得到抽奖数组元素 hd = True For i = LBound(b) To UBound(b) If b(i) = p Then hd = False: Exit For '有重复,重新随机抽取 Next i Loop ReDim Preserve b(UBound(b) + 1) b(UBound(b)) = a(p) & "获得:" & gStr '将得到抽奖的人赋给新数组 End Sub
第一个人来抽奖,在1~N范围内产生一个随机数t,看元素a[t]的值就可以知道是否中奖。然后将a[t]与队尾的a[N]交换,之后N值减一,变为999;
第二个人来抽奖,同样在1~N(注意这时N=999)范围内产生一个随机数t,根据a[t]判断是否中奖。然后再将a[t]与队尾的a[N]交换,N值减一;
……
如此循环直到N=0,所有人抽奖完毕.
List1.AddItem i
Next i然后从这个范围内随机获取某一个项目 获得了以后记得干掉获取的项目,那样就不会有 下次获取同样项目值的事情发生了我一直把list 当数组用.
好处是数组的元素可以把它干掉所以LZ 的题目可以这样写写看:=============cike例题==========
name=随机抽奖
form=command1+list1
步骤:
放入command1 和 list1 到 form1中贴入代码 运行既可
================================Private Sub Command1_Click()
RandomizeFor i = 1 To 4
For j = 1 To i
a = Int(Rnd * List1.ListCount)
Print i & "等奖" & i & "名,号码为:" & List1.List(a)
List1.RemoveItem a
Next j
Next i
End SubPrivate Sub Form_Load()
For i = 1 To 1000
List1.AddItem i
Next i
End Sub
Dim b As VariantPrivate Sub Command1_Click()
getAward a, "一等奖"
For i = LBound(b) To UBound(b)
Print b(i) '打印到窗口
Next i
End Sub
Private Sub Form_Load()
ReDim a(1000) As Variant
ReDim b(0) As Variant
For i = 1 To 1000
a(i) = "人名" & i
Next i
End Sub
'抽奖程序
Sub getAward(pAry, gStr)
Dim p, hd As Boolean
Do Until hd
Randomize
p = Int((UBound(a) - LBound(a)) * Rnd + LBound(a)) '随机得到抽奖数组元素
hd = True
For i = LBound(b) To UBound(b)
If b(i) = p Then hd = False: Exit For '有重复,重新随机抽取
Next i
Loop
ReDim Preserve b(UBound(b) + 1)
b(UBound(b)) = a(p) & "获得:" & gStr '将得到抽奖的人赋给新数组
End Sub