国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于VFP的隨機(jī)數(shù)研究與應(yīng)用

2021-10-18 06:23
關(guān)鍵詞:參數(shù)值調(diào)用排序

趙 康

(商丘職業(yè)技術(shù)學(xué)院,河南 商丘 476100)

引言

隨著科技的進(jìn)步,隨機(jī)數(shù)的運(yùn)用已經(jīng)滲透社會(huì)的各行各業(yè).學(xué)術(shù)界對(duì)隨機(jī)數(shù)的討論以及對(duì)隨機(jī)參數(shù)的選取也是眾說(shuō)紛紜.隨機(jī)數(shù)最重要的特性是前后產(chǎn)生的兩個(gè)數(shù)沒(méi)有邏輯關(guān)系,即真正的隨機(jī).但我們?cè)谌粘9ぷ骱蜕钪?,使用?jì)算機(jī)接觸的隨機(jī)數(shù)只是某些工具根據(jù)一些參數(shù)在特定的計(jì)算方式下生成的具有隨機(jī)數(shù)某些特征的偽隨機(jī)數(shù).VFP是一種集成了面向?qū)ο蟪绦蛟O(shè)計(jì)工具的小型數(shù)據(jù)庫(kù)管理系統(tǒng)[1],由于其結(jié)構(gòu)簡(jiǎn)單、功能強(qiáng)大、性能穩(wěn)定等特點(diǎn),因此,VFP在社會(huì)各行各業(yè)都有著廣泛的應(yīng)用基礎(chǔ)[2].本文就VFP所提供的隨機(jī)函數(shù)RAND()在生成隨機(jī)數(shù)時(shí)出現(xiàn)的生成相同序列隨機(jī)數(shù)、生成隨機(jī)數(shù)重復(fù)率等問(wèn)題進(jìn)行探討.

1 隨機(jī)數(shù)的概述

隨機(jī)數(shù)產(chǎn)生于大量統(tǒng)計(jì)對(duì)象中選取的特殊樣本,這些樣本之間沒(méi)有固定的關(guān)聯(lián)關(guān)系.隨機(jī)數(shù)一般分為三類(lèi).

1)偽隨機(jī)數(shù):它的判定基于統(tǒng)計(jì)學(xué)中所選定的特殊樣本各分類(lèi)的占比大致相等.

2)密碼學(xué)安全的偽隨機(jī)數(shù):在滿(mǎn)足第一類(lèi)偽隨機(jī)數(shù)的基礎(chǔ)上,抽取部分樣本不能有效地演算出隨機(jī)樣本的剩余部分的信息.

3)真隨機(jī)數(shù):在滿(mǎn)足第一類(lèi)條件和第二類(lèi)條件的基礎(chǔ)上,還必須滿(mǎn)足隨機(jī)樣本不可重復(fù)的條件.

生成隨機(jī)數(shù)的方法稱(chēng)為隨機(jī)數(shù)發(fā)生器,隨機(jī)數(shù)發(fā)生器分為兩類(lèi)[3].

1)物理性隨機(jī)數(shù)發(fā)生器:它以噪聲、溫度等物理信息獲取隨機(jī)數(shù).

2)偽隨機(jī)數(shù)發(fā)生器:通過(guò)固定重復(fù)的計(jì)算得到具有隨機(jī)數(shù)統(tǒng)計(jì)特征的偽隨機(jī)數(shù).

2 VFP中隨機(jī)函數(shù)RAND()的功能特點(diǎn)

VFP為用戶(hù)提供了300多種函數(shù)[4],用戶(hù)在使用這些函數(shù)處理實(shí)際問(wèn)題時(shí),一般都需要多個(gè)函數(shù)配合使用才能解決問(wèn)題.

隨機(jī)函數(shù)RAND()的基本格式為:RAND([<隨機(jī)參數(shù)>]),調(diào)用函數(shù)返回一個(gè)0-1的數(shù)值型隨機(jī)數(shù)[5].在實(shí)際使用過(guò)程中,RAND()函數(shù)可以配合其他函數(shù)疊加使用,從而滿(mǎn)足用戶(hù)的需求.例如:生成0-999之間的隨機(jī)整數(shù),只需要將RAND()的返回值乘上1000,然后再使用取整函數(shù)INT()對(duì)數(shù)據(jù)結(jié)果處理即可.即:INT(RAND()*1000);若要生成某個(gè)指定范圍內(nèi)的隨機(jī)整數(shù),可做如下變形:INT((n2-n1+1)*RAND()+ n1),其中,n2是隨機(jī)數(shù)范圍的上限,n1是隨機(jī)數(shù)范圍的下限.INT((999-100+1)*RAND()+100)就是生成三位整數(shù)的隨機(jī)數(shù).

3 隨機(jī)函數(shù)RAND()使用過(guò)程中產(chǎn)生相同隨機(jī)序列的問(wèn)題

在VFP中,函數(shù)的調(diào)用需要有輸出值和返回值,這相當(dāng)于簡(jiǎn)單的函數(shù)式:y=f(x),當(dāng)x值確定后根據(jù)對(duì)應(yīng)法則f,就會(huì)有確定的y值與之對(duì)應(yīng).但隨機(jī)函數(shù)RAND()可以通過(guò)循環(huán)語(yǔ)句反復(fù)被調(diào)用來(lái)生成一個(gè)隨機(jī)數(shù)列.我們以每組輸出10個(gè)隨機(jī)數(shù)的5組數(shù)據(jù)為例.因?yàn)?,本例的設(shè)計(jì)是為了論證在隨機(jī)參數(shù)缺省時(shí),無(wú)論代碼被運(yùn)行幾次返回的數(shù)值都將會(huì)是同一個(gè)隨機(jī)數(shù)列,因此,省略了外層循環(huán).運(yùn)行程序生成的隨機(jī)數(shù)結(jié)果,如表1所示.

具體代碼如下:

CLEAR

SET TALK OFF

FOR i=1 TO 10

REPLACE 測(cè)試1 WITH RAND()

SKIP

ENDFOR

SET TALK ON

RETURN

由表1可知,5次程序運(yùn)行的結(jié)果得到的5組隨機(jī)數(shù)數(shù)列是相同的,這和我們的預(yù)計(jì)結(jié)果是一致的.因?yàn)?,?dāng)調(diào)用隨機(jī)函數(shù)所使用的隨機(jī)參數(shù)為省略,參數(shù)值將取默認(rèn)缺省值100001.雖然隨機(jī)參數(shù)缺省隨機(jī)函數(shù)會(huì)返回序列中的下一個(gè)隨機(jī)數(shù),但是,這段代碼中隨機(jī)參數(shù)的初值是固定的,因此,無(wú)論代碼被執(zhí)行多少次總會(huì)返回相同的數(shù)列,這樣所產(chǎn)生的數(shù)列不能滿(mǎn)足我們的實(shí)際需求.為此,我們可以考慮,在進(jìn)入輸出隨機(jī)數(shù)列循環(huán)體之前調(diào)用一次參數(shù)值為負(fù)數(shù)的隨機(jī)函數(shù)RAND(-1),其目的是將系統(tǒng)時(shí)鐘的當(dāng)前秒數(shù)用作隨機(jī)數(shù)的隨機(jī)參數(shù)值,如此,運(yùn)行程序的多次調(diào)用是有時(shí)間差的,反映到實(shí)驗(yàn)結(jié)果上的隨機(jī)數(shù)列也必然不同.具體結(jié)果如表2所示.

表1 運(yùn)行程序生成的隨機(jī)數(shù)列結(jié)果

具體代碼修改如下:

CLEAR

SET TALK OFF

RAND(-1)

FOR i = 1 TO 10

REPLACE 測(cè)試1 WITH RAND()

SKIP

ENDFOR

SET TALK ON

RETURN

由表2可知,經(jīng)過(guò)首先調(diào)用含有負(fù)參數(shù)的隨機(jī)函數(shù)RAND(-1)再使用RAND()生成的序列就是比較令人滿(mǎn)意的隨機(jī)數(shù)列了.

表2 運(yùn)行修正后程序的隨機(jī)數(shù)列結(jié)果

4 隨機(jī)函數(shù)RAND()使用中產(chǎn)生隨機(jī)數(shù)的重復(fù)率問(wèn)題

根據(jù)隨機(jī)數(shù)發(fā)生器的工作原理可知,在確定隨機(jī)參數(shù)初值后,每一次隨機(jī)函數(shù)的調(diào)用都會(huì)將上一個(gè)生成的隨機(jī)數(shù)作為下一次調(diào)用的隨機(jī)參數(shù)值.由于發(fā)生器在設(shè)計(jì)時(shí)對(duì)參數(shù)值精度的選定,因此,其結(jié)果必然會(huì)出現(xiàn)參數(shù)值相同的現(xiàn)象.這反映到隨機(jī)數(shù)列上就是在隨機(jī)數(shù)列中的重復(fù)值問(wèn)題.為了探討隨機(jī)數(shù)在使用過(guò)程中的重復(fù)值現(xiàn)象,我們以追加每組50個(gè)數(shù)的10組3位隨機(jī)整數(shù)為例.

具體代碼如下:

CLEAR

SET TALK OFF

USE "測(cè)試"

RAND(-1)

FOR i=1 TO 50

REPLACE cs1 WITH INT((999-100+1)*RAND()+100)

SKIP

ENDFOR

SET TALK ON

RETURN

如表3所示,統(tǒng)計(jì)每50個(gè)數(shù)的3位隨機(jī)數(shù)的重復(fù)率達(dá)6%.目前,隨機(jī)數(shù)產(chǎn)生原理一般是線性同余法或平方取中法,線性同余法產(chǎn)生的隨機(jī)數(shù)會(huì)出現(xiàn)循環(huán)情況,但由于它的模為231,通過(guò)平方取中法產(chǎn)生的隨機(jī)數(shù)會(huì)逐漸趨向于0.因此,隨機(jī)值高重復(fù)率的根源在于實(shí)際問(wèn)題本身.因?yàn)?,我們要求是生?位隨機(jī)整數(shù),因此必須對(duì)隨機(jī)函數(shù)進(jìn)行疊加才能實(shí)現(xiàn)“INT((999-100+1)*RAND()+100)”,但明顯這樣做就舍棄了小數(shù)點(diǎn)后的很多位,其解決重復(fù)數(shù)據(jù)的辦法是通過(guò)擴(kuò)大位數(shù)的手段降低重復(fù)率.在數(shù)據(jù)量較小時(shí),對(duì)于個(gè)別重復(fù)數(shù)據(jù)的手動(dòng)微調(diào)可以降低重復(fù)率.但在實(shí)際工作中,如果數(shù)據(jù)量較大,那么對(duì)數(shù)據(jù)的查重和對(duì)數(shù)據(jù)的修改就很容易出錯(cuò),對(duì)隨機(jī)數(shù)的使用反而不如順序數(shù)來(lái)得直接高效.

表3 3位隨機(jī)數(shù)列出現(xiàn)重復(fù)值的統(tǒng)計(jì)結(jié)果

5 隨機(jī)函數(shù)RAND()在實(shí)際工作中的應(yīng)用

5.1 追加大量隨機(jī)數(shù)時(shí)數(shù)值重復(fù)問(wèn)題解決辦法

在某些工作中,我們會(huì)遇到為某些記錄追加固定長(zhǎng)度的序號(hào),并且出于保密角度的考慮,序號(hào)又不能使用連貫序號(hào)這一問(wèn)題.下面筆者以給20 677條數(shù)據(jù)追加一個(gè)6位不重復(fù)的隨機(jī)數(shù)字段為例(由于一般情況下數(shù)據(jù)表的字段多為字符型,這里需要使用數(shù)值型轉(zhuǎn)字符型函數(shù)STR()和刪除字符串的首部和尾部連續(xù)空格函數(shù)ALLTRIM()).

具體代碼如下:

CLEAR

SET TALK OFF

USE "表名"

RAND(-1)

GO TOP

DO WHILE NOT EOF()

REPLACE ALL zp WITH ALLTRIM(STR(INT((999999-100000+1)*RAND()+100000)))

SKIP

ENDDO

SET TALK ON

RETURN

如表4所示,以20 677條記錄為基礎(chǔ)的6位的隨機(jī)數(shù)重復(fù)率在2%.這個(gè)結(jié)果相對(duì)于上述問(wèn)題的每50個(gè)3位隨機(jī)數(shù)重復(fù)率達(dá)6%的重復(fù)率而言降低了不少,但手工調(diào)整重復(fù)值的方法依然是不可行的.根據(jù)實(shí)際工作需求,為了避免隨機(jī)數(shù)的重復(fù)率問(wèn)題,筆者考慮為每一個(gè)隨機(jī)函數(shù)添加一個(gè)不同的參數(shù)來(lái)控制隨機(jī)數(shù)的重復(fù)率.由于每一張數(shù)據(jù)表中每條記錄的記錄號(hào)是唯一的,筆者將每條記錄的記錄號(hào)設(shè)為隨機(jī)函數(shù)參數(shù)“RAND(RECNO())”,經(jīng)多次追加同一序列的隨機(jī)數(shù)進(jìn)行測(cè)試發(fā)現(xiàn)(每條記錄的隨機(jī)數(shù)是同一個(gè)值),沒(méi)有重復(fù)值的6位隨機(jī)數(shù).

表4 6位隨機(jī)數(shù)列出現(xiàn)重復(fù)值的統(tǒng)計(jì)結(jié)果

5.2 隨機(jī)抽取數(shù)據(jù)庫(kù)相關(guān)信息

在一些娛樂(lè)節(jié)目中,我們經(jīng)常會(huì)看到抽取幸運(yùn)數(shù)字或幸運(yùn)身份證號(hào)碼等環(huán)節(jié).以21 815條記錄的數(shù)據(jù)庫(kù)為例,利用隨機(jī)函數(shù)RAND()返回值是0-1的特點(diǎn),在數(shù)據(jù)庫(kù)內(nèi)隨機(jī)抽取記錄值并返回對(duì)應(yīng)記錄的相關(guān)信息,結(jié)果如圖1所示.

圖1 隨機(jī)抽取5人信息運(yùn)行結(jié)果

在表單的Init事件中添加以下代碼:

IF ! USED("隨機(jī)排序表")

USE 隨機(jī)排序表

ENDIF

RAND(-1)

在timer1控件的Timer事件中添加以下代碼:

FOR i=1 TO 5

texti="text"+ALLTRIM(STR(i))

GO INT(RAND()*21815)

thisform.&texti..Value=IIF(LEN(ALLTRIM(xm))==4,ALLTRIM(xm)+" ",ALLTRIM(xm)+" ")

+LEFT(ALLTRIM(sfzh),6)+"********"+RIGHT(ALLTRIM(sfzh),4)+" "+ALLTRIM(zymc)

ENDFOR

在command1控件的Click事件中添加以下代碼:

thisform.timer1.Interval=270

在command2控件的Click事件中添加以下代碼:

thisform.timer1.Interval=0

上述代碼主要是針對(duì)在已有數(shù)據(jù)的基礎(chǔ)上實(shí)現(xiàn)范圍內(nèi)信息隨機(jī)抽取的功能實(shí)現(xiàn).由于這里輸出的信息是在一個(gè)文本框中進(jìn)行的輸出,考慮到輸出的美觀和信息的隱私性,筆者做了如下處理.因?yàn)樾彰淖謹(jǐn)?shù)個(gè)數(shù)不同,所以需要通過(guò)追加空格以保證輸出信息的整齊“IIF(LEN(ALLTR IM(xm))==4,ALLTRIM(xm)+" ",ALLTRIM(xm)+" ")”(這里只以2個(gè)漢字或3個(gè)漢字進(jìn)行處理,對(duì)于超過(guò)3個(gè)漢字的名字不做說(shuō)明).對(duì)于身份證號(hào)等具有較強(qiáng)隱私性的信息需要對(duì)關(guān)鍵部分進(jìn)行處理,這里筆者通過(guò)函數(shù)“LEFT(ALLTRIM(sfzh),6)+"********"+RIGHT(ALLTRIM(sfzh),4)”對(duì)身份證號(hào)碼中的出生年月日進(jìn)行了替換顯示.這類(lèi)問(wèn)題在工作和生活中應(yīng)用度很高,對(duì)于類(lèi)似的問(wèn)題只需要在本例的基礎(chǔ)上稍加調(diào)整即可實(shí)現(xiàn).

5.3 將1-10的10個(gè)數(shù)字隨機(jī)排序

在工作和生活中,我們經(jīng)常會(huì)碰到一些具體的人或物排序的問(wèn)題.筆者以1-10這10個(gè)數(shù)字為例,對(duì)這10個(gè)具體數(shù)字實(shí)現(xiàn)隨機(jī)排序.

創(chuàng)建一個(gè)臨時(shí)表,具體代碼如下:

RAND(-1)

SELECT 0

CREATE CURSOR testt(x int, y N(6,4))

FOR ii = 1 TO 10

APPEND BLANK

ENDFOR

這段代碼首先為臨時(shí)表的兩個(gè)字段賦值,分別是記錄號(hào)和隨機(jī)數(shù).臨時(shí)表的10條記錄對(duì)應(yīng)1-10這10個(gè)數(shù)字,按照隨機(jī)數(shù)的大小進(jìn)行排序并重寫(xiě)臨時(shí)表,將重寫(xiě)后的臨時(shí)表中的記錄號(hào)字段賦給一個(gè)變量并輸出這個(gè)變量.反復(fù)執(zhí)行下述代碼,實(shí)現(xiàn)10個(gè)數(shù)字的隨機(jī)排序.

REPLACE ALL x WITH RECNO(),y WITH RAND()

SELECT * FROM testt ORDER BY y INTO CURSOR testt READWRITE

testi=''

SCAN ALL

testi=testi+','+TRANSFORM(x)

ENDSCAN

?SUBSTR(testi,2)

運(yùn)行結(jié)果如圖2所示.

圖2 1-10隨機(jī)數(shù)排序運(yùn)行結(jié)果

6 結(jié)論

隨機(jī)數(shù)研究與應(yīng)用可以模擬、解決各活動(dòng)領(lǐng)域中的一些實(shí)際問(wèn)題.根據(jù)隨機(jī)數(shù)的特性和影響隨機(jī)數(shù)發(fā)生的隨機(jī)函數(shù)參數(shù)的選取來(lái)控制和影響隨機(jī)數(shù)的發(fā)生.從本質(zhì)上看,在計(jì)算機(jī)系統(tǒng)中,無(wú)論任何計(jì)算機(jī)語(yǔ)言提供的隨機(jī)函數(shù)所生成的隨機(jī)數(shù),都是通過(guò)一個(gè)參數(shù)在對(duì)應(yīng)算法的基礎(chǔ)上產(chǎn)生的偽隨機(jī)數(shù),這些由隨機(jī)函數(shù)產(chǎn)生的偽隨機(jī)數(shù),基本符合隨機(jī)數(shù)的特性而且實(shí)用價(jià)值很高.本文探討了追加大量隨機(jī)數(shù)時(shí),數(shù)值重復(fù)問(wèn)題的解決辦法、隨機(jī)抽取數(shù)據(jù)庫(kù)中相關(guān)信息進(jìn)行顯示的問(wèn)題和將10個(gè)數(shù)字隨機(jī)排序這3個(gè)工作中經(jīng)常出現(xiàn)的隨機(jī)數(shù)應(yīng)用問(wèn)題,并從實(shí)際問(wèn)題出發(fā)闡明其具體的解決思路.

猜你喜歡
參數(shù)值調(diào)用排序
例談不等式解法常見(jiàn)的逆用
不等式(組)參數(shù)取值范圍典例解析
作者簡(jiǎn)介
恐怖排序
核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
系統(tǒng)虛擬化環(huán)境下客戶(hù)機(jī)系統(tǒng)調(diào)用信息捕獲與分析①
節(jié)日排序
某系列柴油機(jī)與電子調(diào)速器匹配標(biāo)準(zhǔn)化參數(shù)優(yōu)化
逆向思維求三角函數(shù)中的參數(shù)值
利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
云林县| 绥化市| 永善县| 武冈市| 砚山县| 巴中市| 河曲县| 东阳市| 青龙| 雷州市| 且末县| 上虞市| 三亚市| 台北县| 桦甸市| 鹰潭市| 孟津县| 河源市| 揭阳市| 延安市| 富宁县| 呼伦贝尔市| 滨海县| 阿城市| 延边| 北碚区| 赫章县| 常山县| 砚山县| 来安县| 普兰县| 长子县| 安义县| 略阳县| 秦安县| 神农架林区| 新闻| 常宁市| 光山县| 新民市| 双牌县|