2011-01-13

《OpenOffice Calc》模擬樂透下注‧開獎:如何製造出不重複的隨機亂數?

OSS首頁》《文章分類列表》《Base》《Calc》《Draw》《Impress》《Writer

OpenOffice / LibreOffice提供了兩了製造亂數的函數:rand() 及 randbetween(起始值 ; 終止值)。

一般基於使用上的方便,通常會使用randbetween這個函數,來產生隨機亂數。例如:要在1-49間,一次取六個隨機亂數,可能會在A1到A6,這六個儲存格內使用相同的函數 =randbetween(1;49),這會的用法,最大的問題是:產生的六個數字,重複的機率很大。

要如何產生不重複的隨機亂數呢?
先講答案:要透過內建的函數來組合拼湊出1-49中不重複的六個隨機亂數,是一個難度極高的挑戰,一般會建議使用巨集語言來處理,但是使用巨集的門檻,相對上是較難的,不容易被大部分的使用者接受。基於上述的理由,我想出了一個折衷的辦法,就是:那就製造幾乎不可能重複的六個數字吧!

使用Calc內建函數,在1-49間,產生重複機率只有百兆分之49的六個數字:

  1. 在A1到A49,依序複製塞入1-49,這些數字。沒有特別的目的,只是要當做項次來辨識。
  2. 在B1到B49,全部使用公式: =rand()。
    rand這個函數會任意製造介於0~1之間的一個小數,Calc可以接受小數點以下20位的小數,但以rand函數所產生的小數,最多有效到小數點以下15位,這已經夠用了。
  3. 預設所出現的小數位數,不會到達小數以下15位,可以使用增加小數位數的小圖示按鈕,來增加小數的位數。
    也可以用以下方式調整:格式(O)→儲存格(L)
    頁籤:數字
    種類(C):數字
    選項:小數點位數→15
  4. 在C1儲存格,輸入以下函數:=RANK(B1,B$1:B$49)
    RANK使用說明:
    RANK(number; ref; Order)
    number是要決定其排列等級的數值。
    ref是樣本中資料的矩陣或範圍。
    Order(選擇性) 為序列順序。
    [Order] 為 0 表示從陣列的最後一個項目降序排列至第一個項目 (此為預設值),
    [Order] 為 1 表示從範圍的第一個項目升序排列至最後一個項目。
  5. 將C1複製,貼到C2:C49。
  6. 可將C1~C6這六個數,視為隨機產生不重複的六個數。

沒有留言: