EXCEL VBA 亂數原理

<pre class="brush: vb;">
Sub Rand()
 Range("F2:G65535").Clear    '清除儲存格
 a = 7   '常數
 b = 3   '常數
 c = Sheet1.Range("B5")  '常數設定亂數之範圍
 Stime = Now()   '開始時間

 For i = 1 To c  '產生亂數的資料筆數
 
 
  '-----此段判斷值是用來縮減最後一個亂數所計算出來的時間
  If i = c Then
   SumValue = (1 + c) * c / 2
  
   For k = 2 To c + 1  '開始迴圈計算以出現所有值的總和
    NowSumValue = NowSumValue + Cells(k, 6)
   Next k
  
   NowCount = Sheet1.Range("F65536").End(xlUp).Row + 1
   Cells(NowCount, 6) = SumValue - NowSumValue '用總和值減掉目前以產生出來的值總和
   Cells(NowCount, 7) = Now()  '寫入時間
   Etime = Now()   '記錄最後一筆資料產生的時間
   Exit For
  End If
  '-----此段判斷值是用來縮減最後一個亂數所計算出來的時間
 
 
 
  NowCount = Sheet1.Range("F65536").End(xlUp).Row
  chk = 1 '判斷確認有無重覆資料的變數
  NowSecond = Second(Now()) + i
  R1 = (NowSecond * a + b) Mod c
  R2 = (R1 * a + b) Mod c
  R3 = (R2 * a + b) Mod c
  R4 = (R3 * a + b) Mod c
 
 
  '此段迴圈是用來判斷現在產生出來的亂數是否已經存在如果有存在的話chk變數就為0
  For j = 1 To NowCount
   ChkValue = Cells(j, 6)
   If ChkValue = R3 + 1 Then
    chk = 0
    Exit For
   End If
  Next j
 
 
  '上部分的迴圈如果變數不是為0的話就可以將新產生出來的亂數置入
  If chk = 1 Then
   NowCount = Sheet1.Range("F65536").End(xlUp).Row + 1
   Cells(NowCount, 6) = R3 + 1
   Cells(NowCount, 7) = Now()
  Else    '如果為0的話就重新產生此筆亂數
   i = i - 1
  End If
 
 Next i
 Range("D2") = Etime - Stime
End Sub
</pre>

留言

這個網誌中的熱門文章

delivery note和delivery order的區別和翻譯

Eclipse 3.6.1 Helios 中文化方法

牙技專業英文--技工篇