輸入下限和上限,按下「計算」,就會產生該範圍內的亂數。也可以指定個數、小數點後的位數,以及是否可重複(下限和上限以外可以留空。留空時為「整數 1 個、可重複」)。
這個頁面可以做什麼
- 只要輸入下限和上限,馬上就能產生該範圍內的亂數(隨機選出的數)
- 不只整數,也能產生小數的亂數。小數點後的位數可以指定 0~50 位
- 一次最多可以產生 999 個,也能選擇「可重複、不重複」。產生 2 個以上時,除了產生的順序,也會同時顯示遞增、遞減排序的結果
- 從 1~6 這樣的小範圍,到超過 20 位數的巨大整數都能處理
- 這個頁面還整理了亂數原理的淺顯解說,以及可直接複製到 Excel、Google 試算表、Python 使用的公式
這個計算有什麼用?
幫報名者或學生編號,再用亂數來選,就是不摻雜任何人意圖的公平選法。每個人被選中的機率都相同(均勻分布),這就是有數學保證的「抽籤」。
在台灣,大樂透是「從 01~49 選 6 個、不重複」,正是這種形式,選法約有 1,398 萬種(13,983,816 種)。
「不必問遍全台灣的人,為什麼調查一千多人就能了解民意?」——它的基礎,就是用亂數選出受訪者的隨機抽樣。刻意挑選會讓結果偏差,所以用亂數來選,支撐了調查的可信度。
台灣的民調常用的電話隨機撥號(RDD),是用亂數產生電話號碼本身來撥打的方法,讓沒有登記在電話簿上的人也有同等的機會被抽中;近年也會把市話和手機一起抽樣。
即使是複雜到無法用公式解出的問題,只要用亂數試驗好幾萬次並統計結果,就能得到接近答案的值。這稱為蒙地卡羅法,廣泛用於金融機構的風險計算、氣象的系集預報(把條件稍微改變、進行好幾組預測計算的天氣預報方法),以及物理、醫療的研究。
「亂數的平均會趨近期望值」,這個在本頁學到的性質,就是它的理論基礎。
數位遊戲裡的偶然——骰子的點數、洗牌、轉蛋的抽選、地圖的自動產生——全都是用偽亂數做出來的。
「只要種子相同,就會重現相同的數列」這個偽亂數的性質,反而被積極運用在重播功能,以及「和朋友分享同一個種子碼的地圖一起玩」這類機制上。
網購的加密連線、一次性密碼(OTP),沒有「攻擊者無法預測的數」=亂數就無法成立。
這裡不能用可能被預測的一般偽亂數,而是使用經過密碼學強化的產生器,或從熱雜訊等物理現象產生的硬體亂數。「亂數的品質」左右社會的安全,是最嚴格的應用例子。
公式
符號與用語解說
符號
| \(a\) | a | 亂數範圍的下限(大於或等於此數)。(例:1~100 的亂數,\(a = 1\)) |
| \(b\) | b | 亂數範圍的上限(小於或等於此數)。(例:1~100 的亂數,\(b = 100\)) |
| \(P(X=k)\) | P X 等於 k | 亂數 \(X\) 剛好等於整數 \(k\) 的機率。整數的均勻亂數,不論 \(k\) 是多少,值都相同。 |
| \(f(x)\) | f of x(機率密度) | 表示小數亂數「出現容易程度」的圖形高度(機率密度函數)。均勻分布在範圍內處處高度相同。 |
| \(E[X]\) | E X(期望值) | 產生很多個亂數 \(X\) 時,平均會趨近的值。E 是英文 Expectation(期望值)的字首。 |
| \(u\) | u | 0 以上、未滿 1 的均勻亂數。電腦的亂數多半先以這個形式產生,再轉換成想要的範圍。 |
| \(\lfloor\ \rfloor\) | floor(下取整函數) | 把裡面的數小數點以下無條件捨去成整數的符號。台灣的課本也常寫成高斯符號 \([x]\)。(例:\(\lfloor 3.2 \rfloor = 3\)) |
| \(X_n\) | X 下標 n | 偽亂數數列的第 \(n\) 個值。最初的值 \(X_0\) 就是種子。 |
| \(\bmod\) | mod | 取除法餘數的計算。(例:\(38 \bmod 16 = 6\)。38 除以 16 得 2 餘 6) |
用語
| 亂數 | 像骰子的點數那樣,沒有規律、無法預測下一個會出現什麼的數。本頁的產生器會從指定的範圍中隨機選出數字。 |
| 均勻分布 | 範圍內每個值都一樣容易出現的分布。整數亂數是「每個整數的機率都相同」,小數亂數則是「圖形的高度處處相同」。 |
| 偽亂數 | 用計算式產生、「看起來像亂數」的數列(也稱為偽隨機數)。英文的產生器稱為 PRNG(Pseudo Random Number Generator,偽亂數產生器)。電腦的亂數幾乎全都是偽亂數。 |
| 種子 | 開始計算偽亂數時的最初的值(seed)。從相同的種子開始,就會重現完全相同的亂數數列。平常會依時間等自動決定,所以每次看起來都是不同的數列。 |
| 線性同餘法 | 反覆「乘、加、取餘數」,是產生偽亂數最經典的方法。很適合用來學習原理,但現在實際使用的主流是品質更高的方法(梅森旋轉演算法等)。 |
| 硬體亂數 | 從骰子、硬幣、大氣的電子雜訊、電子電路的熱雜訊等物理現象產生的亂數。不依靠計算式,無法重現,可以得到接近「真亂數」的數。 |
| 期望值 | 依機率出現的值「重複很多次時的平均」。均勻亂數的期望值剛好在範圍的正中間。 |
| 隨機抽樣 | 不加入人的意圖,用亂數等方式隨機選出調查對象。是統計調查避免偏差的基本方法,也稱為簡單隨機抽樣。 |
建議先了解的基礎知識
為了讓您「真正理解意義」地使用這個頁面的計算,這裡整理了建議事先理解的基礎知識。
| 有餘數的除法(國小三~四年級,8~10 歲) |
|
| 小數與無條件捨去(國小四~五年級,9~11 歲) |
|
| 百分率(國小五~六年級,10~12 歲) |
|
| 機率的基礎(國中九年級,14~15 歲) |
|
| 期望值(高中,15~18 歲) |
|
用 Excel 計算的方法
| 下限 a | 1 |
| 上限 b | 6 |
| 每個整數出現的機率 | =1/(B2-B1+1) |
| 下限 a | 0 |
| 上限 b | 10 |
| 機率密度(圖形的高度) | =1/(B2-B1) |
| 下限 a | 1 |
| 上限 b | 100 |
| 亂數的平均(期望值) | =(B1+B2)/2 |
| 下限 a | 1 |
| 上限 b | 100 |
| 整數亂數(每次重新計算都會改變) | =B1+INT(RAND()*(B2-B1+1)) |
| 目前的亂數 Xn | 7 |
| 乘數 a | 5 |
| 加數 c | 3 |
| 除數 m | 16 |
| 下一個亂數 | =MOD(B2*B1+B3,B4) |
第 1 個表格會顯示約 0.1667(=1/6),第 3 個表格會顯示 50.5,第 5 個表格會顯示 6。
第 4 個表格的 RAND() 是產生「0 以上、未滿 1 的亂數」的函數,和「公式」章節的轉換式形式完全相同。每按一次 F9 鍵,就會產生新的亂數。
另外,整數亂數也有 Excel 專用的函數 =RANDBETWEEN(B1,B2),用 1 個函數就能得到相同的結果。
用 Google 試算表計算的方法
| 下限 a | 1 |
| 上限 b | 6 |
| 每個整數出現的機率 | =1/(B2-B1+1) |
| 下限 a | 0 |
| 上限 b | 10 |
| 機率密度(圖形的高度) | =1/(B2-B1) |
| 下限 a | 1 |
| 上限 b | 100 |
| 亂數的平均(期望值) | =(B1+B2)/2 |
| 下限 a | 1 |
| 上限 b | 100 |
| 整數亂數(每次重新計算都會改變) | =B1+INT(RAND()*(B2-B1+1)) |
| 目前的亂數 Xn | 7 |
| 乘數 a | 5 |
| 加數 c | 3 |
| 除數 m | 16 |
| 下一個亂數 | =MOD(B2*B1+B3,B4) |
把表格整個複製、貼到 A1 儲存格,再把輸入儲存格的數值改成自己的值即可。
用 Python 計算的方法
import random
lower = 1 # 下限
upper = 100 # 上限
count = 5 # 產生的個數
# 整數亂數(可重複)
integers = [random.randint(lower, upper) for _ in range(count)]
# 整數亂數(不重複)
unique_integers = random.sample(range(lower, upper + 1), count)
# 小數亂數
decimals = [random.uniform(lower, upper) for _ in range(count)]
print(f"整數亂數(可重複):{integers}")
print(f"整數亂數(不重複):{unique_integers}")
print(f"小數亂數:{decimals}")
# 決定種子後,不論執行幾次都會重現相同的數列(偽亂數的性質)
random.seed(42)
print(f"種子 42 的亂數:{[random.randint(1, 100) for _ in range(3)]}")
用 LaTeX 等數學式語言的寫法(可直接複製)
P(X = k) = 1 / (b − a + 1)
P(X = k) = \frac{1}{b - a + 1}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>P</mi><mo>(</mo><mi>X</mi><mo>=</mo><mi>k</mi><mo>)</mo>
<mo>=</mo>
<mfrac>
<mn>1</mn>
<mrow><mi>b</mi><mo>−</mo><mi>a</mi><mo>+</mo><mn>1</mn></mrow>
</mfrac>
</mrow>
</math>
P(X = k) = 1/(b - a + 1)
1/(b - a + 1)
p := 1/(b - a + 1);
p = 1/(b - a + 1);
P(X = k) = 1/(b - a + 1)
f(x) = 1 / (b − a)
f(x) = \frac{1}{b - a}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo>
<mo>=</mo>
<mfrac>
<mn>1</mn>
<mrow><mi>b</mi><mo>−</mo><mi>a</mi></mrow>
</mfrac>
</mrow>
</math>
f(x) = 1/(b - a)
1/(b - a)
f := 1/(b - a);
f = 1/(b - a);
f(x) = 1/(b - a)
E[X] = (a + b) / 2
E[X] = \frac{a + b}{2}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>E</mi><mo>[</mo><mi>X</mi><mo>]</mo>
<mo>=</mo>
<mfrac>
<mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow>
<mn>2</mn>
</mfrac>
</mrow>
</math>
E[X] = (a + b)/2
(a + b)/2
mean := (a + b)/2;
mean_x = (a + b)/2;
E[X] = (a + b)/2
n = a + ⌊u × (b − a + 1)⌋
n = a + \lfloor u \times (b - a + 1) \rfloor
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>n</mi>
<mo>=</mo>
<mi>a</mi>
<mo>+</mo>
<mo>⌊</mo>
<mi>u</mi>
<mo>×</mo>
<mo>(</mo><mi>b</mi><mo>−</mo><mi>a</mi><mo>+</mo><mn>1</mn><mo>)</mo>
<mo>⌋</mo>
</mrow>
</math>
n = a + |__ u xx (b - a + 1) __|
a + Floor[u*(b - a + 1)]
n := a + floor(u*(b - a + 1));
n = a + floor(u*(b - a + 1));
n = a + ⌊u × (b - a + 1)⌋
Xₙ₊₁ = (a·Xₙ + c) mod m
X_{n+1} = (a X_n + c) \bmod m
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<msub><mi>X</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msub>
<mo>=</mo>
<mo>(</mo>
<mi>a</mi><msub><mi>X</mi><mi>n</mi></msub>
<mo>+</mo><mi>c</mi>
<mo>)</mo>
<mo>mod</mo>
<mi>m</mi>
</mrow>
</math>
X_(n+1) = (a X_n + c) mod m
Mod[a*x + c, m]
X[n + 1] := (a*X[n] + c) mod m;
x_next = mod(a*x + c, m);
X_(n+1) = (a X_n + c) mod m
請 ChatGPT 幫忙計算的方法
你是產生亂數的助理。請務必實際執行 Python 程式碼來進行下列工作,並只以執行結果的數值作為回答的依據(亂數不執行程式碼就無法產生。請不要用猜測或自己編的數字)。 1. 產生 5 個 1~100 的整數亂數,不可重複。 2. 把這 5 個數由小到大排序。 3. 產生 1 個 0.2~112.5 範圍內的小數亂數,取到小數點後 3 位。 請列出使用的程式碼,以及執行結果的數值。
使用方法
-
1輸入數值在輸入欄中輸入要計算的數值
-
2計算按下「計算」按鈕
-
3查看結果計算結果會立即顯示。計算的思路和公式的解說,也都能在同一個頁面查看
DataChef 的特色
不需專業知識,操作直覺又簡單
無須登錄任何個人資料
按下「下載」後自動刪除檔案
無須標註來源出處
亦無須事先取得商用授權