請教問,我想00-99組變(100個號碼),分配到5個組別裡面,怎麼寫呢?每按一次會亂數隨即分配
比如說
組別 分配(如果平均分配每組會出現20個數字)(但是我需要亂數分配)
a5(1)
a6(2)
a7(3)
a8(4)
a9(5)
設一按鈕(按下會亂數從新分配)
heartgame wrote:
原問題
請教問,我想00-99組變(100個號碼),分配到5個組別裡面,怎麼寫呢?每按一次會亂數隨即分配
比如說
組別 分配(如果平均分配每組會出現20個數字)(但是我需要亂數分配)
a5(1)
a6(2)
a7(3)
a8(4)
a9(5))
我不會寫Python但是我可以提供想法給你看, 可能比較老派, 因為我不喜歡用隨機生成去比對的方式,像是樓上寫的那種比對方式,後面就已經不是隨機數了,當然啦,應該是不用那麼嚴謹,但我的做法就會是下面那樣,用一個循環通過不斷的交換值,就能搞定隨機分配
先建立1個數組
A(0)~A(99)循序分配好如
A(0)=1
A(1)=2
A(2)=3
...
A(99)=100
然後做一個0~99的循環
將 A(i) 與 A(範圍是0~99的亂數) 裡面的值互相交換
這樣就永遠不會有重複的數字也確保每一次都是亂數
例
for i = 0 to 99
x = A(i) // 取出當前值
y = A(範圍是0~99的亂數) //取出0~99任意位置的值
A(i) = y //交換
A(範圍是0~99的亂數) = x //交換
next
最後再吧 A()數組去做你想做的拆分即可
nicko_wen wrote:
我不會寫Python(恕刪)
nicko_wen大大
謝謝分享另一種更好又更有效率的方法5分送上
我的不重覆只能用在數量少,數量一多就跑不完了
另外用您分享的方法改寫成python
import random
numList = [x for x in range(0,100)] #建立0-99數字陣列
for index,num in enumerate(numList):
randIndex = random.randint(0,len(numList)-1) #隨機index
numList[index] = numList[randIndex] #index與randindex的陣列中真實數字值互換
numList[randIndex] = num
for i in range(0,5): #將100個數字的陣列分為5組
s = i * 20
e = s + 20
print(numList[s:e]) #列印每組數字
概念就是隨機取得需求範圍內的亂數,
然後比對是否與已存在的數值重覆,
若無,則依序存放至陣列中,
待完成此步驟後,再依需求分成所需組別!
此方式的優點是最容易理解,程式也易撰寫,
但缺點是處理時間無法控制,
運氣好時可以很快完成,
但數量一多,最後的 10% 有可能得等很久才能找到尚缺少的數字!
六樓的 nicko_wen 提供的就是另一種較佳的解法,
我以前念書時,從一位程式設計高手同學那學到的就是此方式!
可把該方式想像成是撲克牌洗牌,
先依序把牌放入陣列,
隨機從中抽取兩張牌並對調其位置,
重覆此動作多次後,原本整齊的牌即會被打亂!
ps.
在程式執行時,有可能挑選到同樣位置的牌(數值),
但當陣列數量愈大,重覆機率愈低,
因此在多次對調中,可忽略此少數重覆的可能!
此方式的優點是可以百分之百控制時間(即使有數千或上萬筆資料),
只要設定好洗牌(對調)次數,每次處理的時間都會一樣,
就算陣列內容為非規則性數字或文字(如撲克牌或麻將牌),
差別只在一開始依序放入陣列的步驟!
My Interior Knowledge is Extraordinaire