本文實(shí)例講述了Python編程實(shí)現(xiàn)生成特定范圍內(nèi)不重復(fù)多個隨機(jī)數(shù)的2種方法。分享給大家供大家參考,具體如下:
在近期進(jìn)行的一個實(shí)驗(yàn)中,需要將數(shù)據(jù)按一定比例隨機(jī)分割為兩個部分。這一問題的核心其實(shí)就是產(chǎn)生不重復(fù)隨機(jī)數(shù)的問題。首先想到的遞歸的方法,然后才發(fā)現(xiàn)Python中居然已經(jīng)提供了此方法的函數(shù),可以直接使用。具體代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#生成某區(qū)間內(nèi)不重復(fù)的N個隨機(jī)數(shù)的方法 import random; #1、利用遞歸生成 resultList = []; #用于存放結(jié)果的List A = 1 ; #最小隨機(jī)數(shù) B = 10 #最大隨機(jī)數(shù) COUNT = 10 #生成隨機(jī)數(shù)的遞歸數(shù)學(xué),參數(shù)counter表示當(dāng)前準(zhǔn)備要生成的第幾個有效隨機(jī)數(shù) def generateRand(counter): tempInt = random.randint(A,B); # 生成一個范圍內(nèi)的臨時隨機(jī)數(shù), if (counter< = COUNT): # 先看隨機(jī)數(shù)的總個數(shù)是不是夠了,如果不夠 if (tempInt not in resultList): # 再檢查當(dāng)前已經(jīng)生成的臨時隨機(jī)數(shù)是不是已經(jīng)存在,如果不存在 resultList.append(tempInt); #則將其追加到結(jié)果List中 counter + = 1 ; # 然后將表示有效結(jié)果的個數(shù)加1. 請注意這里,如果臨時隨機(jī)數(shù)已經(jīng)存在,則此if不成立,那么將直接執(zhí)行16行,counter不用再加1 generateRand(counter); # 不管上面的if是否成立,都要遞歸。如果上面的臨時隨機(jī)數(shù)有效,則這里的conter會加1,如果上面的臨時隨機(jī)數(shù)已經(jīng)存在了,則需要重新再生成一次隨機(jī)數(shù),counter不能變化 generateRand( 1 ); #調(diào)用遞歸函數(shù),并給當(dāng)前要生成的有效隨機(jī)數(shù)的個序號置為1,因?yàn)橐獜牡谝粋€開始嘛 print (resultList) # 打印結(jié)果 #2、利用Python中的randomw.sample()函數(shù)實(shí)現(xiàn) resultList = random.sample( range (A,B + 1 ),COUNT); # sample(x,y)函數(shù)的作用是從序列x中,隨機(jī)選擇y個不重復(fù)的元素。上面的方法寫了那么多,其實(shí)Python一句話就完成了。 print (resultList) # 打印結(jié)果 |
結(jié)果:
希望本文所述對大家Python程序設(shè)計有所幫助。