亂數:
呼叫 Rnd 前,請使用沒有引數的 Randomize 陳述式以系統計時器做為種子來初始化亂數產生器。
不重覆的演算法還算蠻常見的,以下就用Excel來展現。
法一:比對法
'比對法
Sub myRand()
Dim StartTime As Date
Randomize Timer
Dim i As Long, r As Long, j As Long, k As Long
Dim N() As Long, M() As Long
Dim RowCon As Long, ColCon As Integer
Dim Con As Long
Cells.Clear
RowCon = 7
ColCon = 7
Con = RowCon * ColCon
k = 1
StartTime = Timer
ReDim N(Con) As Long
ReDim M(1 To RowCon, 1 To ColCon) As Long
For i = 1 To Con '亂數序列中不會有相同的數字
r = 1
Do Until r <> 1 'r = 1 表示N(i)的亂數有重複
N(i) = Int(Con * Rnd) + 1 '取亂數
r = 0
For j = 1 To i - 1
If N(i) = N(j) Then '檢查是否重複,若重複就重取亂數
r = 1
Exit For
End If
Next j
Loop
Next i
'陣列轉移
For i = 1 To RowCon
For j = 1 To ColCon
M(i, j) = N(k)
k = k + 1
Next j
Next i
'填入工作表
With Sheets("pro")
.Range(Cells(1, 1), Cells(RowCon, ColCon)).Value = M
End With
Sheets("inf").Range("A1").Value = "比對法-產生" & Con & "個 亂數排列,花費: " & Format(Timer - StartTime, "00.00") & " 秒."
End Sub
法二,抽牌法
Sub myRand1()
Dim StartTime As Date
Dim Index() As Long, NextIndex() As Long
Dim TraData() As Long
Dim x As Long, y As Long, z As Long
Dim i As Long, j As Long, k As Long
Dim RowCon As Long, ColCon As Long
Application.ScreenUpdating = False
RowCon = 100
ColCon = 100
x = RowCon * ColCon '初值
y = 0
Cells.Clear
ReDim Index(x) As Long '建立空的陣列
ReDim NextIndex(x) As Long '建立空的陣列
ReDim TraData(1 To RowCon, 1 To ColCon) As Long
StartTime = Timer
Do Until y = x
Randomize
z = Int(x * Rnd + 1) '產生亂數
If Index(z) = 0 Then 'Index(z)陣列為0,表示這個位置沒有人坐
Index(z) = 1 '把亂數代入陣列
y = y + 1
NextIndex(y) = z '亂數重新排列,看起來才夠亂
End If
Loop
'陣列轉移
For i = 1 To RowCon
For j = 1 To ColCon
k = k + 1
TraData(i, j) = NextIndex(k)
Next j
Next i
'填入工作表
With Sheets("pro")
.Range(Cells(1, 1), Cells(RowCon, ColCon)).Value = TraData
End With
Sheets("inf").Range("A2").Value = "抽牌法-" & "產生" & x & "個 亂數排列,花費: " & Format(Timer - StartTime, "00.00") & " 秒."
Application.ScreenUpdating = True
End Sub
洗牌法
Sub test()
Dim x(1 To 60) As Integer
For i = 1 To 60
x(i) = i
Next
For j = 1 To 1000
a1 = Int(Rnd() * 60) + 1
a2 = Int(Rnd() * 60) + 1
temp = x(a1)
x(a1) = x(a2)
x(a2) = temp
Next
For l = 1 To 60
Cells(l, 1) = x(l)
Next
End Sub
排序法
A1=rand(), b1=rank(a1,$a$1:a$60)
拖拉放, b1:b60就是1-60隨機分派
2014年3月7日 星期五
訂閱:
張貼留言 (Atom)
關節卡卡或彈響
關節間產生的潤滑液少,關節摩擦的損耗 髖關節彈響。 一般有兩種情況,第一種是關節外彈響較常見。 發生的主要原因是髂脛束的後緣或臀大肌肌腱部的前緣增厚, 在髖關節作屈曲、內收、內旋活動時,增厚的組織在大粗隆部前後滑動而發出彈響, 同時可見到和摸到一條粗而緊的縴維帶在...
-
================== Range("A1").Select With Selection .HorizontalAlignment = xlLeft '水平對齊 .VerticalAlignment = xl...
-
儲存格 [R1C1]格式,[A1]格式 Cells(列次,欄次).Select Cells(2, "A").Select '2列A欄 Cells(2, 1).Select '2列1欄 Cells.Item(5,”C”...
沒有留言:
張貼留言