請教問,100個號碼,亂數平均分配到5個組別裡面,怎麼寫呢?每按一次會亂數隨即分配

請教問,我想00-99組變(100個號碼),分配到5個組別裡面,怎麼寫呢?每按一次會亂數隨即分配

比如說

組別 分配(如果平均分配每組會出現20個數字)(但是我需要亂數分配)
a5(1)
a6(2)
a7(3)
a8(4)
a9(5)

設一按鈕(按下會亂數從新分配)
kentkane wrote:
比如說


亂數平均分配成(每組都是 20 個的) 五組這個概念比較奇怪
到後面其實不是亂數

KISS,
每個字串丟個亂數 0.xxxxxxxxxxxxxx 作指標碼
按指標碼排序
分別就 1~20、21~40、......、81~100 歸組
很多編寫程式軟體,

就有定好的取亂數可引用。

要如何達到你要的,

須小小思考一下的。
等那一天,利益不是人的主要目的,那麼我才會被別人說服....................
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]) #列印每組數字
原本 shibuy 在四樓提供的是最常見的方法,
概念就是隨機取得需求範圍內的亂數,
然後比對是否與已存在的數值重覆,
若無,則依序存放至陣列中,
待完成此步驟後,再依需求分成所需組別!

此方式的優點是最容易理解,程式也易撰寫,
但缺點是處理時間無法控制,
運氣好時可以很快完成,
但數量一多,最後的 10% 有可能得等很久才能找到尚缺少的數字!

六樓的 nicko_wen 提供的就是另一種較佳的解法,
我以前念書時,從一位程式設計高手同學那學到的就是此方式!

可把該方式想像成是撲克牌洗牌,
先依序把牌放入陣列,
隨機從中抽取兩張牌並對調其位置,
重覆此動作多次後,原本整齊的牌即會被打亂!

ps.
在程式執行時,有可能挑選到同樣位置的牌(數值),
但當陣列數量愈大,重覆機率愈低,
因此在多次對調中,可忽略此少數重覆的可能!

此方式的優點是可以百分之百控制時間(即使有數千或上萬筆資料),
只要設定好洗牌(對調)次數,每次處理的時間都會一樣,
就算陣列內容為非規則性數字或文字(如撲克牌或麻將牌),
差別只在一開始依序放入陣列的步驟!
My Interior Knowledge is Extraordinaire
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!