线性同余法的vb变通实现
vb吧
全部回复
仅看楼主
level 11
余思培 楼主
如题
2021年06月22日 16点06分 1
level 11
余思培 楼主
2021年06月22日 16点06分 2
level 11
余思培 楼主
因为vb6 Mod函数无法计算大值的取余计算,于是乎手动写了一个
Private Function Mod2(ByVal qwNum As Currency, ByVal qwMod As Currency) As Currency
  Dim t@
  t = Int(qwNum / qwMod)
  t = t * qwMod
  Mod2 = qwNum - t
End Function
2021年06月22日 16点06分 3
这里的int会不会出问题呢?我不知道int函数对自变量范围有没有规定。
2021年06月23日 00点06分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 int不是Cint,应该没问题
2021年06月23日 00点06分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 或者说至少在初步的测试中还没有碰到问题
2021年06月23日 00点06分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 而且本身qwMod的值会比较大,得出来的值也就会比较小
2021年06月23日 00点06分
level 11
余思培 楼主
初始化函数及随机数函数为:
Private Sub Init()
  m = 2 ^ 32
  a = 1664525
  c = 1013904223
  x = Timer
  r = 10
  xm = &H21071AD6
End Sub
Private Function Rnd2() As Long
  x = CCur(x * a + c)
  x = Mod2(x, m)
  Rnd2 = Int(x / m * r)
  x = Mod2(x, xm)
End Function
2021年06月22日 16点06分 4
level 11
余思培 楼主
xm = &H21071AD6值的获得通过溢出时跳转获得
Private Sub Test()
  Dim i&, t@
  On Error GoTo ExitError:
  Do
    t = CCur(i * a + c)
    i = i + 1
  Loop
ExitError:
  boxEnd = "&H" & Hex(i - 1)
End Sub
2021年06月22日 16点06分 5
level 11
余思培 楼主
注意,虽然m = 2 ^ 32,但是,r的有效范围=xm=&H21071AD6
毕竟32位程序的一般计算上限在那儿。
2021年06月22日 16点06分 6
level 11
余思培 楼主
至于有什么用,举个例子,在某些需要随机函数参与的加密算法中,用这种方法可以跨语言/平台加密编码/解码
2021年06月22日 16点06分 7
1