最近几天想用vba写一个背单词的小工具,用来常常考考本身,要在单词本中随机的抽出必定数量的单词来,第一次没有发现什么问题,但是但我第二次第三次打开这个工具的时候,问题出现了,就是每次都是“随机”产生那么几个单词,失败!
翻了翻之前的书,结合网络上的一些帖子,总结一下缘由,知识就是靠点滴积累的嘛!
一、首先计算机是一个肯定性的系统,不可以产生真正的随机数,因此程序当中给出的随机函数,所产生的随机数都是经过底层计算获得的,而这些计算须要一个叫作“种子”的数。
二、这个“种子”做为随机函数的初期值,计算出第一个“随机”数来,而后以获得的第一个“随机”数为种子在进行计算获得下一个“随机”数来,以此类推。
三、这样,若是程序每次启动运行,做为随机函数的初期值的那个种子是肯定不变的,那么获得的第一个“随机”数也就是肯定的,进而以后生成的“随机”数,也是肯定的,这样就和尚以此程序运行产生的随机数序列同样了,当让也就无“随机”可言了。呵呵!这也是我没随机检索到单词的缘由。
四、由于不可以产生真正的随机数,因此只可以尽量的让产生的数字,重复的几率下降,起码让它长生的数字看起来足够“随机”,办法就是让种子不断的变化,根据变化的“种子”计算出来的数字,固然也是变化的。
五、解决方案:就是在每次运行随机函数以前,都要给随机函数一个新的种子,如今比较经常使用的作法就是利用系统时间,由于时间是永远都不相同的,这样就可以保证每次都给随机函数一个新种子,进而产生的数字,就应该可以达到随机的要求了。
在VBA当中的实现:
Private Sub CommandButton1_Click()
Dim j, k As Double
Randomize
For k = 1 To 10
j = Rnd() * 100 + 1
ThisWorkbook.Sheets(1).Cells(k, 1).Value = CStr( j )
Next k
MsgBox "OK!"
End Sub
其中Randomize[number]语句的做用初始化随机函数Rnd(),目的就是让Rnd()每次有一个新的种子值,若是没有number,则用系统计时器返回的值做为新的种子值。
注意:若是想获得重复的随机数序列,直接调用Rnd( )函数就好,使用具备一样number 值的 Randomize 是不会获得重复的随机数序列的。
语言都是相同的,其余语言也都有相相似的语句。
记在这里,点滴积累。