谁知道数据库中怎样产生随机数

谁知道数据库中怎样产生随机数,第1张

公式:(上限 - 下限 + 1 ) * rand() - 下限

介绍:John von Neumann说:Any one who considers arithmetical methods of producing random digits is , of course, in a state of sin.

所以,在讨论算法实现随机数的时候,总是说“伪随机数”。

现在,应用最广的随机数生成算法是由Derrick Henry Lehmer1951年给出的线性同余法:

Xn+1 = ( aXn + c ) mod m, n>=0.

在上一篇伪随机数的论述中,并没有给出X0, a, c, m的取值规则,只是给出了ANSI C和Microsoft Visual C++的实现。

在这儿我们可以自己先思考一下,我们期望从上式中得到的随机数应该满足:

1) 上式的输出足够随机,这是最基本的要求;

2) 上式给出尽量多的输出,越接近m个越好(不可能超过m),即周期尽量长,最好为m,这样才能保证上式满足均匀分布(m个数在周期m中各出现一次);

3) 上式的生成速度足够快。

最容易想到的,m的取值为计算机字大小(如2^32或2^64)。

但是这儿有个很严重的问题:Xn低位的随机性很弱。原因如下:

令d|m, 且

Yn = Xn mod d

Yn+1 = ( ( aXn + c ) mod m ) mod d

= ( aYn + c ) mod d

上述表达式的意义即:Yn为Xn低k位(d=2^k),这样的Yn序列形成周期为d甚至更短的同余序列。举例说明:d为2^1时,Yn为Xn的最低位(可假定为1或0),若Yn+1 != Yn,则Yn+2 == Yn必定成立,仅当a、c皆为奇数时Yn、Yn+1将0、1交替,否则,为常数(0或1)。

暂时抛开随机性不管,先找到周期为m的随机序列中的取值规则。

Donald Knuth在The Art of Computer Programming, Volume 2: Seminumerical Algorithms中的3.2.1.2节对m, a, c和X0取值规则的表述:

1) gcd(c, m) = 1. 即c, m互素,再白一点,c, m除1之外没有其他公因子;

2) 任给质数p, p|m ==>p|(a-1). 即m%p==0,则(a-1)%p==0。

3) 4|m ==>4|(a-1). 即m%4==0,则(a-1)%4==0。

这个证明过程对于我这样的数论基础不是很扎实的搞应用技术的人来说有点难以理解了。有兴趣的话,还是去看3.2.1.2的证明吧:-)。

上面的规则告诉我们,满足了上述规则后,可以保证序列周期为m。对于前面提到的关于随机性的问题,既然Xn低位的随机性比较弱,可以只取Xn的高位作为输出。高位的随机性和统计意义由a, c确定,其取值涉及统计检验,具体的也还是看3.3吧。

这篇文章解决了具有统计意义的随机数的部分理论问题。

PS: 之前曾经BS过Windows Live Writer,当时觉得Writer编辑功能太少,不能直接设定链接文字的字体颜色,知道CSS可以设定之后,又觉得Word 2007编辑的Blog转成html之后太大,而且也知道Word 2007上面是可以设置链接的target为_blank的。现在发现Writer还是很不错的了,原来是可以设定格式的,也可以直接编辑html,而且可以Web预览,链接还可以加入到链接词汇表,挺方便的。

access中产生随机数用rnd函数。

如:

select  rnd()

执行结果:

说明:

rnd() 产生一个大于等于0 且小于 1的随机数,如果要产生[m,n]中随机的整数公式:int((n-m+1)*rnd)+m

int(rnd()*1000)表达式产生大于0,小于1000的整数

int(rnd()*900)+100表达式产生大于100,小于1000的整数

首先要引用ADO对象,打开菜单“工程-引用”,选择“Microsoft ActiveX Data Objects 2.0 Library”将其沟选,这样就可以进行声明ADO对象了

Dim cnn As New ADODB.Connection 'ADO连接对象

Dim Collection As ADODB.Recordset 'ADO记录集对象

Dim Cnt As Integer '计算产生随机数的个数

Dim No() As Integer '动态数组存放所有产生的随机数字

Private Sub Command1_Click()

Form_Unload (True) '调用窗体的卸载事件

End Sub

Private Sub Form_Load()

cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0Data Source=" App.Path "\Collection.mdb"

'打开数据库连接,驱动程序Microsoft.Jet.OLEDB.4.0,数据源为当前目录下的Collection数据库

Set Collection = New ADODB.Recordset

'申请一个新的Collection记录集对象

Collection.Open "select * from tab", cnn, adOpenKeyset, adLockOptimistic

'打开记录集对象

End Sub

Private Sub Form_Unload(Cancel As Integer)

Dim i As Integer

If Cnt


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10027855.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存