張明浩 王虹宇 張毅寧
(鞍山師范學(xué)院物理科學(xué)與技術(shù)學(xué)院,遼寧 鞍山 114007)
基于Python技術(shù)的自然圖像隨機(jī)數(shù)生成設(shè)計(jì)
張明浩 王虹宇 張毅寧
(鞍山師范學(xué)院物理科學(xué)與技術(shù)學(xué)院,遼寧 鞍山 114007)
根據(jù)隨機(jī)數(shù)驗(yàn)證圖形散亂無(wú)序這一特征,反演隨機(jī)數(shù)列。大自然中有許多景象,我們從中隨機(jī)提取一幅或多幅圖像。利用Python語(yǔ)言,通過(guò)高斯模糊將黑白圖像的黑白點(diǎn)均勻化,利用斐波那契數(shù)列多次提取等方法,得到一組或多組隨機(jī)數(shù),最后經(jīng)過(guò)蒙特卡洛π驗(yàn)證,證明這組數(shù)是隨機(jī)數(shù)。
斐波那契數(shù)列;蒙特卡洛驗(yàn)證;高斯模糊;隨機(jī)數(shù);Python
目前,數(shù)學(xué)對(duì)隨機(jī)數(shù)(或隨機(jī)序列)仍然沒(méi)有統(tǒng)一定義。真隨機(jī)數(shù)性質(zhì)的一般描述是在隨機(jī)序列無(wú)限長(zhǎng)的情況下具有如下性質(zhì):
(1)均勻分布:一串真隨機(jī)序列滿足均勻分布的統(tǒng)計(jì)特性,如序列的每一位是0或1的概率相等,都為0.5。
(2)不可預(yù)測(cè)性:真隨機(jī)序列的每一位是相互獨(dú)立的,給定序列某一位的值,并不能預(yù)測(cè)或計(jì)算出后一位的值。
基于數(shù)學(xué)算法的偽隨機(jī)數(shù)發(fā)生器實(shí)際上可以產(chǎn)生近似于均勻分布隨機(jī)序列。現(xiàn)代計(jì)算機(jī)算法已經(jīng)可以產(chǎn)生足夠好的偽隨機(jī)數(shù),其周期性已經(jīng)不再是關(guān)鍵問(wèn)題,但是與真隨機(jī)數(shù)相比最大的區(qū)別在于可否對(duì)下次結(jié)果進(jìn)行預(yù)測(cè)。很明顯偽隨機(jī)數(shù)雖然快捷,但是對(duì)于同樣的種子,產(chǎn)生的隨機(jī)序列將會(huì)是相同的,顯然不具有不可預(yù)測(cè)性[1]。
常用的產(chǎn)生偽隨機(jī)數(shù)的數(shù)學(xué)算法有線性同余發(fā)生器(linear congruential generator),延遲斐波那契發(fā)生器(lagged Fibonacci generator)和線性反饋移位寄存器(linear feedback shift register)等[2]。
除了基于確定數(shù)學(xué)算法的偽隨機(jī)數(shù)發(fā)生器,還有一類(lèi)是物理偽隨機(jī)數(shù)發(fā)生器,產(chǎn)生的隨機(jī)數(shù)是來(lái)源于客觀的物理過(guò)程,但客觀的物理過(guò)程并不意味著真隨機(jī)。相對(duì)于數(shù)學(xué)算法,物理偽隨機(jī)數(shù)發(fā)生器的隨機(jī)性兩大特點(diǎn):
一是理論上準(zhǔn)確地描述很多實(shí)際的物理過(guò)程非常困難和復(fù)雜,即便是掌握了物理系統(tǒng)的初值和運(yùn)行規(guī)律,也很難精確地計(jì)算出這些物理過(guò)程將來(lái)的狀態(tài)。
二是周?chē)h(huán)境對(duì)于物理系統(tǒng)的運(yùn)行產(chǎn)生影響,比如兩個(gè)相同的器件由于溫度或電壓等條件的影響,系統(tǒng)開(kāi)始運(yùn)行的初值可能不同,這也導(dǎo)致了預(yù)測(cè)的困難。
由于本質(zhì)上很多物理過(guò)程并不是真隨機(jī)的,理論上并不滿足不可預(yù)測(cè)性的要求。所以產(chǎn)生的隨機(jī)數(shù)為偽隨機(jī)數(shù)。其研究設(shè)計(jì)過(guò)程一般是先選取一個(gè)物理世界的真隨機(jī)源,然后選用特定的方法從中提取真隨機(jī)數(shù)。物理真隨機(jī)數(shù)發(fā)生器具有真正的隨機(jī)性和不可預(yù)知性,其采樣的真實(shí)物理現(xiàn)象有多種[3],如:放射性衰變,電子電路噪聲,大氣噪聲,電子振蕩器的頻率抖動(dòng),激光混沌,光子相位噪聲,光量子的偏振等。
常用的基本檢驗(yàn)方法有:頻數(shù)檢驗(yàn),序列檢驗(yàn),撲克檢驗(yàn),游程檢驗(yàn)和自相關(guān)檢驗(yàn)等,但目前并不存在真正意義上的真隨機(jī)性的檢測(cè)方法,這是因?yàn)檎骐S機(jī)性是基于無(wú)限長(zhǎng)序列的,所以數(shù)學(xué)統(tǒng)計(jì)上的檢測(cè)是無(wú)法完成的。目前工業(yè)上常用的統(tǒng)計(jì)檢測(cè)一般是基于固定長(zhǎng)度隨機(jī)序列的(一般是1 Gbit),如 ENT(pseudo-random number sequence test program),NIST-STS(a statistical test suite for the validation of random number generators and pseudo random number generators for cryptographic applications),Diehard(a battery of tests of randomness)等[4]。其中ENT檢驗(yàn)為國(guó)際上通用的隨機(jī)數(shù)檢測(cè)程序,將給出產(chǎn)生的隨機(jī)序列的數(shù)學(xué)平均值,每比特熵值,χ檢測(cè)值,Monte Carlo方法計(jì)算得到的π值,以及序列相關(guān)系數(shù)。
首先,從自然界中提取一幅或多幅圖像,可以假定一般情況下,這一圖像不具有規(guī)律重復(fù)特征,然后將其轉(zhuǎn)化為黑白圖像;轉(zhuǎn)化過(guò)程中,利用高斯模糊將黑白圖像中的黑白點(diǎn)均勻化,進(jìn)而轉(zhuǎn)化成0-1序列;再將其轉(zhuǎn)化為一個(gè)大十進(jìn)制數(shù),其后再?gòu)倪@個(gè)十進(jìn)制中按斐波那契序列提取一定數(shù)量的數(shù)列作為一個(gè)十進(jìn)制數(shù)。依次改變提取起始位,經(jīng)過(guò)循環(huán)多次提取,獲得一組隨機(jī)數(shù)。
Python是一種面向?qū)ο?、支持?dòng)態(tài)語(yǔ)義、內(nèi)置高級(jí)數(shù)據(jù)結(jié)構(gòu)、語(yǔ)法簡(jiǎn)潔優(yōu)美、易于擴(kuò)展的解釋型腳本語(yǔ)言(script language)[5]。OpenCV(Open Source Computer Vision Library)是一個(gè)基于(開(kāi)源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù),可以運(yùn)行在Linux、Windows和Mac OS操作系統(tǒng)上。它具有輕量級(jí)且高效的特點(diǎn)——由一系列C函數(shù)和少量C++類(lèi)構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語(yǔ)言的接口,提供圖像處理和計(jì)算機(jī)視覺(jué)方面的很多通用算法1[6]。因此,我們將二者結(jié)合進(jìn)行圖像處理。
利用OpenCV工具包對(duì)圖像進(jìn)行二值處理十分方便,圖像處理前后如圖1所示,其過(guò)程如下:
im_gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#用灰度模式打開(kāi)要處理的圖像
retval,im_at_fixed=cv2.threshold(im_gray,50,255,cv2.THRESH_BINARY)#將50-255之間的灰度值作為圖像轉(zhuǎn)換的閾值
im_at_gaussian=cv2.adaptiveThreshold(im_gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,7)#對(duì)圖像進(jìn)行高斯模糊,保證0、1值均勻分布
圖1 像處理前后原圖與灰度圖
進(jìn)一步將黑白圖像轉(zhuǎn)化成0-1序列,存儲(chǔ)到文件“num.txt”中。
num=""
for i in range(img.shape[0]):#對(duì)圖像值的二維數(shù)組進(jìn)行遍歷
for j in range(img.shape[1]):
if img[i][j]>100:num+="1"#將高于100灰度值定為1,否則為0
else:num+="0"
f=file("num.txt","a")#將10序列轉(zhuǎn)化為字符型存儲(chǔ)到“num.txt”文件中
f.write(str(int(num,2)))
f=open("num.txt")#打開(kāi)“num.txt”文件
mystr=f.read()#將“num.txt”文件中的0-1序列讀出
f.close()
n=len(mystr)-index[-1]#得到10序列長(zhǎng)度
index=[1,2,3,5,8,13,21,33,54,87]#斐波那契數(shù)列
num=[0]*n
for i in range(n):
mynum=""
for j in range(len(index)):
mynum+=mystr[i+index[j]]#以斐波那契數(shù)列為下標(biāo)獲得一個(gè)數(shù)組成的字符
num[i]=float(int(mynum)/10000000000.00)#將下標(biāo)獲得的字符變成浮點(diǎn)小數(shù),經(jīng)循環(huán)后變成數(shù)組
fo=open("newnum.csv","w");fo.write("random, ")#將浮點(diǎn)小數(shù)數(shù)組變成字符存儲(chǔ)到"newnum.csv"文件中
for i in range(n):fo.write(str(num[i])+","+" ");fo.close()
蒙特卡羅方法是以概率和統(tǒng)計(jì)理論方法為基礎(chǔ)的計(jì)算方法[7]。認(rèn)為平面系上的一個(gè)邊長(zhǎng)為1的正方形及其內(nèi)部的一個(gè)形狀不規(guī)則的“圖形”,向該正方形“隨機(jī)地”投擲N個(gè)點(diǎn),有M個(gè)點(diǎn)落于“圖形”內(nèi),則該“圖形”的面積近似為M/N。而這個(gè)圖形接近圓,其面積為π。實(shí)現(xiàn)代碼如下:
import pylab as plt#加載pylab繪圖包
incount=0;count=100000;x=[];y=[];
for i in range(count):x.append(num[i]);y.append(num[count+i])#將小數(shù)數(shù)組賦給蒙特卡洛點(diǎn)變量x,y
if(x[i]**2+y[i]**2)<1:incount+=1#如果x,y對(duì)應(yīng)的點(diǎn)在單位元內(nèi),計(jì)數(shù)加1
plt.scatter(x,y,s=0.1,edgecolors='none')#匯出點(diǎn)圖
plt.text(-0,-0.05,"pi="+str(4.0*incount/count))#標(biāo)記蒙特卡洛比值,并和π做比較
plt.text(-0,-0.10,"count="+str(count));plt.show()
圖2 蒙特卡洛π驗(yàn)證圖
我們進(jìn)行簡(jiǎn)單隨機(jī)抽樣100次,實(shí)驗(yàn)結(jié)果π值如下:
圖3 實(shí)驗(yàn)結(jié)果π值統(tǒng)計(jì)圖
在上述100個(gè)數(shù)據(jù)中,最小值為3.12704,最大值為3.15249,平均值為3.14076,標(biāo)準(zhǔn)誤為0.00557。在圖3中,橫坐標(biāo)的值為實(shí)驗(yàn)數(shù)據(jù)的數(shù)值,縱坐標(biāo)的值為統(tǒng)計(jì)數(shù)量。根據(jù)圖3我們可以得出:左側(cè)的直方圖顯示,這些數(shù)據(jù)圍繞π這一數(shù)值緊密聚類(lèi),大體上呈現(xiàn)正態(tài)分布,處于穩(wěn)定狀態(tài)。中間的概率密度圖顯示,這些數(shù)據(jù)的范圍無(wú)限接近于π值,并且越接近π值,概率越高。右側(cè)的累計(jì)曲線顯示,在π值附近分布的比重最大。根據(jù)上述結(jié)果,我們可以看出,實(shí)際數(shù)值是與理論數(shù)值π值非常接近的,也就代表著我們這個(gè)實(shí)驗(yàn)的準(zhǔn)確性。
表1 實(shí)驗(yàn)結(jié)果π值
自然圖像隨機(jī)數(shù)生成器的設(shè)計(jì)有其他實(shí)驗(yàn)不可比擬的優(yōu)勢(shì):首先,取材方便,一幅自然圖片就可以,甚至可以是一個(gè)人臉照片;其次,生成速度快,利用計(jì)算機(jī)程序直接操作處理,沒(méi)有模數(shù)轉(zhuǎn)換過(guò)程,不受外界變量控制;再則,成本低,幾乎沒(méi)有實(shí)驗(yàn)器材,得到的是優(yōu)于數(shù)學(xué)算法的隨機(jī)數(shù)。最為重要的是個(gè)性化特點(diǎn)明顯,調(diào)整不同的照片,就可以提取不同的序列號(hào),確保唯一性。
[1]Aj's Blog.科普:什么是隨機(jī)數(shù)[EB/OL].https://www.6zou.net/docs/what_is_random.html.2016-6-10.
[2]郭弘,劉鈺,黨安紅,等.物理真隨機(jī)數(shù)發(fā)生器[J].科學(xué)通報(bào),2009(23):3651-3657.
[3]于全福.基于量子效應(yīng)的隨機(jī)數(shù)產(chǎn)生研究[D].北京:北京大學(xué),2013.
[4]知乎.如何評(píng)價(jià)一個(gè)偽隨機(jī)數(shù)生成算法的優(yōu)劣[EB/OL].https://www.zhihu.com/question/20222653.2016-6-10.
[5]鐘志強(qiáng).基于Python語(yǔ)言的大學(xué)物理實(shí)驗(yàn)數(shù)據(jù)處理方法研究[J].鞍山師范學(xué)院學(xué)報(bào),2016,18(2):77-81.
[6]李國(guó)軍.?dāng)?shù)字圖像處理的一種新方法[J].鞍山師范學(xué)院學(xué)報(bào),2016,18(2):69-73.
[7]百度百科.蒙特卡洛[EB/OL].http://baike.baidu.com.2015-6-10.
Design of Random Number Generation of Natural Image Based on Python
Zhang Minghao Wang Hongyu Zhang Yining
(Anshan Normal University,Anshan 114007,Liaoning)
Random number has the characteristics of disorder and scatter.Based on this,the random series is retrieved.We can randomly extract images from the nature.This paper uses Gauss fuzzy to homogenize the black points and white points in the binary images with Python language,and uses the Fibonacci sequence for extraction to obtain groups of random numbers.Finally,the Monte Carlo test shows that the number is random.
Fibonacci sequence;Monte Carlo method;Gauss blur;random number;Python
TN918.1 文獻(xiàn)識(shí)別碼:A
1008-6609(2017)08-0013-03
張明浩(1996-),男,天津人,本科,研究方向?yàn)殡娮有畔⒖茖W(xué)與技術(shù)。
2016年遼寧省大學(xué)生創(chuàng)新與創(chuàng)業(yè)項(xiàng)目,機(jī)械隨機(jī)數(shù)生成器的設(shè)計(jì)與實(shí)驗(yàn)與真隨機(jī)數(shù)表的生成;編號(hào):201610169025。