本發(fā)明涉及求取算法領(lǐng)域,尤其涉及一種基于空間搜索的唯一隨機(jī)數(shù)序列的求取算法。
背景技術(shù):
唯一隨機(jī)數(shù)序列在計算機(jī)游戲、軟件測試用例、計算機(jī)考試等場景中經(jīng)常用到,一種最平常的算法是:將每次產(chǎn)生的隨機(jī)數(shù)進(jìn)行比較,以前如果出現(xiàn)過就再發(fā)生一次,這樣如果序列很長的話,越到后面的運(yùn)算,所花的時間越長,并且其時間復(fù)雜度是無法估計的(因?yàn)椴恢朗裁磿r候才能產(chǎn)生與前面不一樣的隨機(jī)數(shù))。通常情況下,由于所使用的隨機(jī)序列不長或者對時間要求不高,并且出現(xiàn)極端情況的幾率很小,所以遇上麻煩的情況很少,并且即使遇到問題也可以通過其他手段處理(比如:中止進(jìn)程),因此,該問題通常情況被忽視。
基于空間搜索的唯一隨機(jī)數(shù)序列的求取算法擬解決的問題是:在已知隨機(jī)序列的數(shù)的上界和下界、隨機(jī)序列的長度的情況下,能否找到一種算法,其空間復(fù)雜度為o(max-min),(max:隨機(jī)序列的上界,min:隨機(jī)序列的下界),時間復(fù)雜度盡可能小,并且不會出現(xiàn)理論上的無限循環(huán)。這樣的算法應(yīng)該盡可能簡單(能為一般軟件人員接受),但非常巧妙,因此可以為千千萬萬的軟件所使用,因而變得十分有意義。
絕大多數(shù)的軟件人員,或多或少都碰到過這個問題,但都忽視了該問題的極端情況。因此,大多數(shù)程序員容易忽略巧妙方法的存在;或者說難以提出問題,也就更不會深入思考了。
因此,有必要提供一種基于空間搜索的唯一隨機(jī)數(shù)序列的求取算法解決以上技術(shù)問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的為了減少獲取唯一隨機(jī)序列的計算量,本算法通過構(gòu)造一個一維的連續(xù)整數(shù)數(shù)組,通過隨機(jī)檢索該數(shù)組的元素,獲得一個隨機(jī)數(shù)序列。由于檢索是隨機(jī)的,所以確定該序列是隨機(jī)的;由于是隨機(jī)檢索,當(dāng)兩次檢索到同一個數(shù)時,需要考慮一個輪轉(zhuǎn)機(jī)制,或者使用其他方法處理。
本發(fā)明提供一種基于空間搜索的唯一隨機(jī)數(shù)序列的求取算法,將直接求取隨機(jī)序列的過程轉(zhuǎn)變?yōu)榍笕∫粋€已知序列的隨機(jī)地址指針的過程,主要包括下面步驟:
步驟1,變量賦值,定義隨機(jī)序列的最大值max,最小值min,一個長度為data[max-min]的數(shù)組和一個長度為length的空數(shù)組data1,其中l(wèi)ength為待求隨機(jī)序列的長度;
步驟2,如果max-min<length,轉(zhuǎn)到步驟9;
步驟3,按照從小(min)到大(max),循環(huán)給data賦值;
步驟4,定義一個循環(huán)變量i=0,如果i>=length,轉(zhuǎn)到步驟9;
步驟5,產(chǎn)生一個0<n<max-min的隨機(jī)數(shù),取data[n];
步驟6,如果data[n]=invalid,n=(n+1)mod(length),回到步驟6;
步驟7,data1[i]=data[n],data[n]=invalid,i=i+1轉(zhuǎn)4;
步驟8,輸出data1;
步驟9,結(jié)束。
與相關(guān)技術(shù)相比,本發(fā)明提供的基于空間搜索的唯一隨機(jī)數(shù)序列的求取算法對于需要頻繁使用隨機(jī)數(shù)序列的場合,如:計算機(jī)游戲、在線考試系統(tǒng)等應(yīng)用場景,可以大幅縮減計算時間,提高軟件的運(yùn)行效率,并排除極端情況下出現(xiàn)的死循環(huán)。
附圖說明
圖1為本發(fā)明提供的基于空間搜索的唯一隨機(jī)數(shù)序列的求取算法的流程圖。圖2為求取一個[0,10)以內(nèi)的5個唯一隨機(jī)正整數(shù)序列情況下,采用該算法運(yùn)算的部分空間變化圖。該圖表示通過兩次運(yùn)算之后的搜索空間的變化情況,第一行為原始空間狀態(tài),左邊10個圓表示data數(shù)組,右邊5個圓表示data1,第二行、第三行是經(jīng)過一輪搜索之后,空間變化情況,第四、五行表示第二次隨機(jī)搜索之后的空間變化。
具體實(shí)施方式
以下將參考附圖并結(jié)合實(shí)施例來詳細(xì)說明本發(fā)明。需要說明的是,在不沖突的情況下,本發(fā)明中的實(shí)施例及實(shí)施例中的特征可以相互組合。為敘述方便,下文中如出現(xiàn)“上”、“下”、“左”、“右”字樣,僅表示與附圖本身的上、下、左、右方向一致,并不對結(jié)構(gòu)起限定作用。
閱讀本例請參閱圖1和圖2(本發(fā)明提供的基于空間搜索的唯一隨機(jī)數(shù)序列的求取算法的流程圖和空間變化示意圖)。
假設(shè)需要求取一個[0,10)以內(nèi)的5個唯一隨機(jī)正整數(shù)序列(實(shí)際情況可能比這個序列大得多),按照本發(fā)明提供的算法,這里max=10,min=0,length=5,由于是正整數(shù),取invalid=-1;采用最簡單的循環(huán)賦值方式為長度為10的一維連續(xù)整數(shù)數(shù)組賦值;采用向后順序流轉(zhuǎn)作為沖突消解策略。
按照本發(fā)明提供的基于空間搜索的唯一隨機(jī)數(shù)序列的求取算法,求取過程按照如下進(jìn)行:
步驟1,變量賦值,定義隨機(jī)序列的最大值max,最小值min,一個長度為data[max-min]的數(shù)組和一個長度為length的空數(shù)組data1,其中l(wèi)ength為待求隨機(jī)序列的長度;
步驟2,如果max-min<length,轉(zhuǎn)到步驟9;
步驟3,按照從小(min)到大(max),循環(huán)給data數(shù)組賦值;
步驟4,定義一個循環(huán)變量i=0,如果i>=length,轉(zhuǎn)到步驟9;
步驟5,產(chǎn)生一個[0,10)之間的隨機(jī)數(shù)n,取data[n];
步驟6,如果data[n]=invalid,n=(n+1)mod(length),回到步驟6;
步驟7,data1[i]=data[n],data[n]=invalid,i=i+1轉(zhuǎn)4;
步驟8,輸出data1;
步驟9,結(jié)束。
由上述算法過程可以看出,該計算方法巧妙之處在于步驟3的順序賦值,步驟5由直接產(chǎn)生隨機(jī)數(shù)而變化為產(chǎn)生隨機(jī)的下標(biāo)指針,步驟6的沖突處理機(jī)制;該程序的空間復(fù)雜度與前面給定的條件一致,為o(max-min),時間復(fù)雜度為t(lenth^2/2),算法完全可控。
與相關(guān)技術(shù)相比,本發(fā)明提供的基于空間搜索的唯一隨機(jī)數(shù)序列的求取算法對于求取給定取值范圍的一個唯一隨機(jī)數(shù)序列問題,通過建立一個已知的非隨機(jī)的順序數(shù)字空間,簡單地在該順序空間隨機(jī)檢索,在時間復(fù)雜度t(n)情況下(n為隨機(jī)數(shù)的個數(shù)),取得一個唯一的隨機(jī)數(shù)序列,避免了二次生成隨機(jī)數(shù)和進(jìn)行循環(huán)比較,從而大幅提高程序的運(yùn)行效率。該算法在計算機(jī)游戲、隨機(jī)測試題目的抽取等方面將獲得廣泛應(yīng)用。
以上所述僅為本發(fā)明的實(shí)施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運(yùn)用在其它相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。