Dim i As Integer
For i = 1 To 125
Randomize Timer
rndNum(i) = Int((250 * Rnd) + 1)
Text1.Text = Text1.Text & rndNum(i) & vbCrLf
Next i生成 1 到 250 的125个随机数,要求无重复数。
上面的代码生成的有重复。请问大家要如何解决?谢谢了
For i = 1 To 125
Randomize Timer
rndNum(i) = Int((250 * Rnd) + 1)
Text1.Text = Text1.Text & rndNum(i) & vbCrLf
Next i生成 1 到 250 的125个随机数,要求无重复数。
上面的代码生成的有重复。请问大家要如何解决?谢谢了
For i = 1 To 125
Randomize Timer
rndnum(i) = Int((250 * Rnd) + 1)
If InStr(Text1.Text, rndnum(i)) <> 0 Then
i = i - 1
Else
Text1.Text = Text1.Text & rndnum(i) & vbCrLf
End If
Next i
用集合的方法:
Dim iCol As Collection
Dim i As Integer, index As Integer
Dim Nums
Set iCol = New Collection
For i = 1 To 125
iCol.Add i
Next
For i = 1 To iCol.Count
Randomize
index = CInt(Rnd * (iCol.Count - 1)) + 1
Nums = iCol.Item(index)
Print Nums
iCol.Remove index
Next
Set iCol = Nothing
dim i as integer,j as integer,tmp as integerfor i=0 to 249
data(i)=i+1
nextRandomizefor i=0 to 124
j=Int(250 * Rnd)
tmp=data(i)
data(i)=data(j)
data(j)=tmp
next
'循环结束则DATA(0)到DATA(124)这125个元素就是无重复随机数
Dim a() As String, i As Integer, temp As Long, x As String
ReDim a(1 To max)
For i = 1 To max
a(i) = i
NextFor i = 1 To num
Randomize
temp = i + Int((max - i) * Rnd)
x = a(temp)
a(temp) = a(i)
a(i) = x
NextReDim Preserve a(1 To num)
MsgBox Join(a, ",")
End SubPrivate Sub Command1_Click()
finds 250, 125
End Sub
ReDim rndNum(250)
也可以:ReDim rndNum(1 to 250)
'扫描域 1-125
'交换域 1-250
FleaRandom rndNum(),True,True,1,125,1,250
需要注意的是:扫描域小于交换域的情况是一种快速算法,但是它与正常算法的结果从概率角度分析是否效果一样还有待研究。曾经有人对这个快速算法提出过疑问。
这个函数的真正用途是多段用法,是相当有趣的一个东西。如果你需要给教育机构编写试卷随机生成,我可以教你怎么用。下面是函数:'FleaRandom Module
'KiteGirl 2005Public Sub FleaRandom(ByRef pList() As Long, Optional ByVal pSet_Scan As Boolean = False, Optional ByVal pSet_Swap As Boolean = False, Optional ByVal pScan_Start As Long = 0, Optional ByVal pScan_End As Long = 0, Optional ByVal pSwap_Start As Long = 0, Optional pSwap_End As Long = 0)
'FleaRandom函数
'语法:FleaRandom(pList() ,[pSet_Scan,] [pSet_Swap,] [pScan_Start,] [pScan_End,] [pSwap_Start,] [pSwap_End] )
'说明:以“跳蚤算法”对序列进行乱序处理。
'参数: long pList() 必要参数。作为序列容器的数组。
' boolean pSet_Scan 可选参数。扫描域设置开关。使其为true则用户设置的扫描域参数有效。
' boolean pSet_Swap 可选参数。交换域设置开关。使其为true则用户设置的交换域参数有效。
' long pScan_Start 可选参数。扫描域开始。
' long pScan_End 可选参数。扫描域结束。
' long pSwap_Start 可选参数。交换域开始。
' long pSwap_End 可选参数。交换域结束。
'交换设置导入
Dim tSwap_Start As Long '交换域开始
Dim tSwap_End As Long '交换域结束
If pSet_Swap Then
tSwap_Start = pSwap_Start
tSwap_End = pSwap_End
Else
tSwap_Start = LBound(pList())
tSwap_End = UBound(pList())
End If
'交换范围
Dim tSwap_Count As Long '交换域元素数
tSwap_Count = (tSwap_End - tSwap_Start) + 1
'{ tSwap_End - tSwap_Start <= 2147483646 }
'交换补偿
Dim tSwap_Rep As Long '交换补偿
tSwap_Rep = tSwap_Start
'扫描设置导入
Dim tScan_Start As Long '扫描开始
Dim tScan_End As Long '扫描结束
If pSet_Scan Then
tScan_Start = pScan_Start
tScan_End = pScan_End
ElseIf (Not pSet_Scan) And pSet_Swap Then
tScan_Start = tSwap_Start
tScan_End = tSwap_End
Else
tScan_Start = LBound(pList())
tScan_End = UBound(pList())
End If '序列扰乱 Dim tList_Index As Long '序列索引
Dim tList_Index_Sur As Long '序列索引_源
Dim tList_Index_Des As Long '序列索引_目的
For tList_Index = tScan_Start To tScan_End
tList_Index_Sur = tList_Index
tList_Index_Des = Int(Rnd * tSwap_Count) + tSwap_Rep
'交换pList(tList_Index_Sur)和pList(tList_Index_Des)
FleaRandom_ValueSwap pList(tList_Index_Sur), pList(tList_Index_Des)
NextEnd SubPrivate Sub FleaRandom_ValueSwap(ByRef pA As Long, ByRef pB As Long)
'FleaRandom_ValueSwap过程
'语法:FleaRandom_ValueSwap pA, pB
Dim tTemp As Long
tTemp = pA: pA = pB: pB = tTemp
End Sub
D. Aldous and P. Diaconis, "Shuffling cards and stopping times", American Mathematical Monthly 93 (1986), 333–348
Trefethen, L. N. and Trefethen, L. M. "How many shuffles to randomize a deck of cards?" Proceedings of the Royal Society London A 456, 2561–2568 (2000) http://www.math.washington.edu/~chartier/Shuffle/
http://www2.toki.or.id/book/AlgDesignManual/BOOK/BOOK4/NODE151.HTM
最初上CSDN的时候就发过这个代码,有年头了。因为算法是将第i个元素与随机位置的元素交换,好象跳蚤一样跳来跳去的。因此叫它跳蚤算法。
我想不会是那个叫KiteGirl的最早发现这个算法,世界上比她聪明的人很多,应该有个学名。
KiteGirl最初发现这个算法是在QB时代,灵感来自QB下的SWAP命令。跳蚤算法属于一种用空间换速度的算法,这种算法当初叫做“摆地摊式算法”(莫菲定理说:如果一个笨方法有效,它就不是一个笨方法)。灵感来自PAL电路,因为PAL电路用真值表的方式实现逻辑电路。当时觉得PAL电路这种做法相当有趣。