本帖最后由 Bodhidharma 于 2013-7-26 14:45 编辑
delete_007 发表于 2013-5-2 07:16
==================答题截止==================
评分及总结见附件,如有意见或建议,敬请批评指正。
版主你好: 因為想要研究「不重複亂數」,經你的推薦,仔細研讀了這個帖子,但是讀完之後有個很大的疑惑:似乎所有的解法,都不符合「完全隨機」的要求。 在版主總結帖的4個思路中,全部都用到了類似的方式,取1~9的不重複亂數: - =MOD(SMALL(RANDBETWEEN(ROW($1:$9)^0,9)/1%+ROW($1:$9),ROW($1:$9)),100)
复制代码
也就是在1~9中,隨機加上100~900,然後由小到大排列後,取其個位數 但是這樣子似乎不完全隨機: 比方說1和2隨機加100*(1~9),有1/9的機率會加到一樣的數 在這個情況下(加到一樣的數),1就會排在2的前面
也就是說,越小的數,排在越前面的機率越高,因此位置似乎並不是完全隨機
9個數字可能結果很多(9^9種情形),所以比較看不出來(不完全隨機),但是數字少的話就很就很清楚:
比方說取1~2的不重複亂數,公式會這樣寫:
- =MOD(SMALL(RANDBETWEEN(ROW($1:$2)^0,2)/1%+ROW($1:$2),ROW($1:$2)),100)
复制代码
兩個RANDBETWEEN產生的所有可能組合就是{101,102},{101,202},{201,102},{201,202} 在這個情況下,第一個位置是1的機率是3/4,是2的機率是1/4。 如果是取1~3的不重複亂數,公式會這樣寫: - =MOD(SMALL(RANDBETWEEN(ROW($1:$3)^0,3)/1%+ROW($1:$3),ROW($1:$3)),100)
复制代码
三個RANDBETWEEN產生的所有可能組合就是:
{101,102,103},{101,102,203},{101,102,303},{101,202,103},{101,202,203},{101,202,303},{101,302,103},{101,302,203},{101,302,303}
{201,102,103},{201,102,203},{201,102,303},{201,202,103},{201,202,203},{201,202,303},{201,302,103},{201,302,203},{201,302,303}
{301,102,103},{301,102,203},{301,102,303},{301,202,103},{301,202,203},{301,202,303},{301,302,103},{301,302,203},{301,302,303}
在這個情況下,第一個位置是1的機率是14/27,是2的機率是8/27,是3的機率是5/27 取1~9的不重複亂數,顯然也會有相同的問題,也就是越小的數,排在越前面的機率越高! 當然把RANDBETWEEN的第二個參數改大,比方說改成 - =MOD(SMALL(RANDBETWEEN(ROW($1:$9)^0,999999)/1%+ROW($1:$9),ROW($1:$9)),100)
复制代码
可以大大增加隨機性,但是嚴格講起來,仍然不是完全隨機。而且本質上來說,這種在SMALL的第一個參數上做文章的方式,只要兩個RANDBETWEEN有可能出現一樣的東西,就一定無法達成完全隨機。 然後我仔細研究了總結帖的4個思路,發現4種方法都無法避開這個問題,使用這4種思路的結果,都會造成「Order_X和Order_Y中越小的數,返回比較小的數的機率」會比較大。 最左上的格子,返回1的機率會比所有其它格子都大,也會比理想中的1/81還要大 這個應該有辦法寫VBA驗證,但是我VBA還不熟,所以目前無法寫出來 麻煩版主看一下我這個想法有沒有問題,如果有人能幫忙寫VBA驗證我會很感謝 另外還是要回到我一開始的問題:是否有辦法用公式,寫一個1~n不重複亂數的內存數組?
|