精華區beta Office 關於我們 聯絡資訊
原題: #18q-ePtR (ask) 49取6,亂數列出1000筆。 (無特別號) http://2y.drivehq.com/p/get6in49.rar 此題的特色是 總共的組合數13983816 取1000組微不足道;另一方面若要先全列出再從中取亂數1000筆,則十分辛苦。 不知VBA有什麼好方法? (*) 因此此檔算是偷懶,取1000筆再來檢查這1000筆當中有無重覆。 用函數取不重覆的亂數,RANK是一定要用到的啦 正常要列出49個亂數,取其中6個的排名,但這裡"剛好"因為7*7=49 所以只要每列放7個亂數,排名的範圍往下延伸,達到7列即可~ 如此已簡單取得一筆49取6不重覆的亂數 但 之後要檢查是否重覆,需要排序, 所以取的時候加上LARGE或SMALL使其有序。 把數字用&接起來,檢查接起來的那一欄有無重覆即可。 隨意試了幾次運算,根本不會重覆到, 所以也不用想如何"一次到位"了 ||| (*) 網路上大致上看到兩種層次的VBA 簡單型的 連一筆49取6都可能重覆 若重覆了就要換(i-1) 稍微厲害的 單一筆的6個數不會重覆,但似乎也沒法避免取到兩筆相同的。 excel的rand()好用啊 因為位數很多 使用簡單型的算法可以達成稍微厲害的層次~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.164.48.248 ※ 編輯: JieJuen 來自: 114.47.32.94 (09/20 06:52)
JieJuen:已更新 加入中獎計算(含特別號) 09/26 02:24
> -------------------------------------------------------------------------- < 作者: chungyuandye (養花種魚數月亮賞星星) 看板: Office 標題: Re: [算表] Excel:49取6 亂數列出1000筆組合(大樂透) 時間: Sat Sep 20 08:19:36 2008 ※ 引述《JieJuen (David)》之銘言: : 原題: #18q-ePtR (ask) : 49取6,亂數列出1000筆。 (無特別號) : http://2y.drivehq.com/p/get6in49.rar : 此題的特色是 總共的組合數13983816 : 取1000組微不足道;另一方面若要先全列出再從中取亂數1000筆,則十分辛苦。 Sub lotto() Dim Fn As Object Set Fn = Application.WorksheetFunction For k = 1 To 1000 For i = 1 To 6 Cells(k, i) = Fn.RoundUp(Rnd * 49, 0) For j = 1 To i - 1 If Cells(k, i) = Cells(k, j) Then i = i - 1 Next Next Next End Sub -- 我打研究室走過 那獨坐電腦前的容顏如苦瓜的糾結 靈感不來 長壽的煙霧不散 研究室如小小的寂寞的城 恰如商管的電梯向晚 http://chungyuandye.blogspot.com -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.136.232 > -------------------------------------------------------------------------- < 作者: JieJuen (David) 看板: Office 標題: Re: [算表] Excel:49取6 亂數列出1000筆組合(大樂透) 時間: Sat Sep 20 20:22:53 2008 嗯 感謝提供 ^^ 這是屬於第一種 "簡單型的 連一筆49取6都可能重覆 若重覆了就要換(i-1)" 好處就是程式碼短,容易看懂~ 隱藏的缺點就是如果49取48就會比較難算 另外,如果我沒理解錯誤的話 仍無法避免各筆之間的重覆(例如k=5和k=995剛好取到一樣的6個數) 目前除了全列出來再取其中1000筆之外 還沒想到不重覆的方法 理論上 每一筆都可以對應到一個數字 例如 1 01 02 03 04 05 06 2 01 02 03 04 05 07 ... 只是不知如何由數字導出該筆組合(MOD什麼的之類) 不過,網路上看的其實是vb版本程式碼 所以我也不知道VBA實際是怎麼寫 另外例如此處設Fn的技巧 都收下學習了 ^^ 感謝 > -------------------------------------------------------------------------- < 作者: JieJuen (David) 看板: Office 標題: Re: [算表] Excel:49取6 亂數列出1000筆組合(大樂透) 時間: Sun Sep 21 00:37:06 2008 由於原提問者還有疑問 進一步說明如下 我們只要專注於一條式子就好了 I1 =RANK(LARGE($A1:$F1,COLUMN(A:A)),$A1:$G7) 這條 其他以此題來說都只是錦上添花~ 先看此式 =RANK(LARGE($A1:$F1, 1 ),$A1:$G7) 與上式會算出相同結果 LARGE($A1:$F1, 1 ) 這是在$A1:$F1這6個數中找第1大的數 =RANK(LARGE,$A1:$G7) 求出此數在$A1:$G7這49個數中的排名 如此一來,此RANK得到的數必定是1~49之間的整數 而且由於$A1:$G7內的rand()幾乎不會重覆 排名自然不會相同,就得到亂數取的1~49間不重覆整數 最後 COLUMN(A:A) 是讓式子往右拉時 數字會增加 1 2 3 4 5 6這樣 方便取第1 2 3 4 5 6大的數,如此排序後即可檢查1000筆中是否重覆 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.47.32.94