首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

请诸位大侠给个思路

2013-07-27 
请各位大侠给个思路老师我的表述不清楚1.我想从数组c(1),c(2),c(3)........c(a)......c(35)共35个整数中随

请各位大侠给个思路
老师我的表述不清楚
1.我想从数组c(1),c(2),c(3)........c(a)......c(35)共35个整数中随机取5个不同整数,为保证不同,我不想采用一般的遍历法(相同的再重新取),而是想取一个随机整数a(介于1-35)对应从c(1),c(2),c(3)........c(a)......c(35)拿出c(a),
而原来的数组只余下c(1),c(2),c(3)........c(a-1),c(a+1),............c(35)(共34个数)仍保持原来顺序,
然后取一个随机整数b(介于1-34)对应从c(1),c(2),c(3)........c(a-1),c(a+1),............c(35)中拿出c(b)(在新顺序中第b个),
只余下c(1),c(2),c(3)........c(b-1),c(b+1),............c(35)(共33个数)仍保持原来顺序
以此类推得到数组d(5),其中d(1)=c(a),d(2)=c(b),d(3)=c(c),d(4)=c(d),d(5)=c(e),
2.将以上过程执行n次得到n个数组d(n,5)

综合以上考虑,想到用列表框。由于是个菜鸟,作乱了
老师,谢谢您,请问怎样实现
这样如果能实现,感觉到取随机数比较广泛一些。


[解决办法]
本帖最后由 bcrun 于 2013-07-15 17:19:26 编辑

function GetDifference() as long()
dim a(1 to 35) as long
dim B(4) as long
dim i as long

for i=0 to 4
retry:
n=1+rnd*35
if a(n)=1 then retry 'a(n)=1表示n这个数已经用过了

b(i)=c(n)
a(n)=1
next
getdifference=b
end function

[解决办法]
你要认为只有用术语描述才算“水平高”,那就算你水平高吧。
事实说话,线性同余可以
Option Explicit

Private seed As Long
Private Const a As Long = 71
Private Const m As Long = 35
Private Const c As Long = 66

Function Rand() As Long
    seed = (seed * a + c) Mod m
    Rand = seed
End Function

Sub Main()
    Dim i As Long
    
    Randomize
    seed = Int(Rnd() * m)
    
    For i = 1 To m
        Debug.Print i, Rand + 1
    Next
End Sub

[解决办法]
继续代码说话,验证所有的起始 seed 下都不会重复
Sub Check()
    Dim aUsed() As Boolean


    Dim r As Long
    Dim i As Long
    Dim j As Long
    
    For j = 0 To m - 1
        seed = j
        Debug.Print "验证 seed = " & j
        
        ReDim aUsed(1 To m)
        
        For i = 1 To m
            r = Rand + 1
            If aUsed(r) Then
                Debug.Print "重复: " & r
            Else
                aUsed(r) = True
            End If
        Next
    Next
    
End Sub


[解决办法]
引用:
继续代码说话,验证所有的起始 seed 下都不会重复
Sub Check()
    Dim aUsed() As Boolean
    Dim r As Long
    Dim i As Long
    Dim j As Long
    
    For j = 0 To m - 1
        seed = j
        Debug.Print "验证 seed = " & j
        
        ReDim aUsed(1 To m)
        
        For i = 1 To m
            r = Rand + 1
            If aUsed(r) Then
                Debug.Print "重复: " & r
            Else


                aUsed(r) = True
            End If
        Next
    Next
    
End Sub



贴出代码很好,不妨用你的代码替lz运行下。多运行几次,看看结果真的是你说的“无规律”么?
[解决办法]

Dim i As Integer, n As Integer

List1.Clear
For i = 1 To 35
    List1.AddItem c(i)
Next i
Randomize
For i = 1 To 5 
    n = Int(Rnd * List1.ListCount)
    d(i) = List1.List(n)
    List1.RemoveItem n
Next i

热点排行