比如说有1000人参加抽奖.定义:a(1000),a是备选数据的数组,每次抽后,把抽出的数与数组的末处的交换,然后在前面进行随机抽取.原理是不是这样,那我如何区别奖项呢,比如说谁是一等奖,谁是二等奖,代码如何写啊

解决方案 »

  1.   

    和你说的基本类似。首先初始化数组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,所有人抽奖完毕.
      

  2.   

    这个问题好解决! 我一直都用这样的办法: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
      

  3.   

    这问题比较简单,写一段代码给你参考吧,可以立即测试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