→ 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
原題: #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)