在 Excel 中,生成隨機數(shù)有兩個函數(shù),分別為Rand函數(shù)和RandBetween函數(shù),前者用于生成 0 到 1 之間的隨機數(shù),后者用于生成指范圍的隨機數(shù)。它們生成的隨機數(shù)中都會產(chǎn)生重復值,如果要生成不重復的隨機數(shù)得用變通的方法,通常有兩種方法,一種為先生成種子再生成不重復的隨機數(shù),另一種為用多個函數(shù)生成。以下就是Excel生不重復隨機數(shù)和小數(shù)隨機數(shù)的具體操作方法,實例中操作所用版本均為 Excel 2016。
(一)Rand函數(shù)
1、表達式:RAND()
2、說明:RAND() 用于生成 0 到 1 之間均勻分布的隨機數(shù)。如果要生成指定范圍的隨機數(shù),表達式可以這樣寫:RAND()*(b-a) + a。
(二)RandBetween函數(shù)
1、表達式:RANDBETWEEN(bottom, top)
2、說明:RandBetween 用于生成指定范圍的隨機數(shù),bottom 為生成隨機數(shù)的開始值,top 為生成隨機數(shù)的最大值。例如:要生成 10 到 100 的隨機數(shù),可以這樣寫:RANDBETWEEN(10, 100)。
(一)用 RAND() 生成小數(shù)隨機數(shù)
1、選中 A1 單元格,輸入公式 =RAND(),按回車,則生成一個小數(shù)隨機數(shù);再次選中 A1,把鼠標移到 A1 右下角的單元格填充柄上,按住左鍵,往下拖,則所經(jīng)過單元格都用 A1 的值填充,按 Ctrl + S 保存,則每個單元格變?yōu)樾律傻碾S機數(shù);操作過程步驟,如圖1所示:
圖1
2、用 Rand() 生成指定范圍的隨機數(shù)
假如要生成 1 到 100 的隨機數(shù)。選中 A1 單元格,把公式 =RAND()*(100 - 1) + 1 復制到 A1,按回車,則生成一個 1 到 100 之間的隨機數(shù);同樣方法往下拖并保存生成其它隨機數(shù),操作過程步驟,如圖2所示:
圖2
(二)用 RandBetween() 生成指定范圍的隨機數(shù)
假如要生成 50 到 100 之間的隨機數(shù)。選中 A1 單元格,把公式 =RANDBETWEEN(50, 100) 復制到 A1,按回車,生一個 50 到 100 之間的隨機數(shù);同樣用往下拖并保存的方法生成其它隨機數(shù),操作過程步驟,如圖3所示:
圖3
(一)方法一:先生成種子再生成不重復的隨機數(shù)
1、生成不重復的小數(shù)隨機數(shù)。選中 A1 單元格,輸入公式 =RAND(),按回車,則生成一個隨機數(shù),把鼠標移到 A1 的單元格填充柄上并往下拖,然后 Ctrl + S 保存,生成其它隨機數(shù);選中 B1 單元格,輸入公式 =RAND()*A1,按回車,則生成一個不重復隨機數(shù),同樣方法往下拖并保存,生成其它不重復隨機數(shù);操作過程步驟,如圖4所示:
圖4
2、生成不重復的整數(shù)隨機數(shù)
A、假如要生成 10 到 100 之間的不重復隨機數(shù)。把公式 =RANDBETWEEN(10,100) 復制到 A1 單元格,按回車,生成一個隨機數(shù);用往拖并保存的方法生成其它隨機數(shù);把公式 =INT(RANDBETWEEN(10,100)*A1/100) 復制到 B1 單元格,按回車,生成一個不重復的隨機數(shù),同樣用往下拖的方法,生成其它不重復的隨機數(shù);操作過程步驟,如圖5所示:
圖5
B、公式說明:公式 =INT(RANDBETWEEN(10,100)*A1/100) 先用 RANDBETWEEN 求出 10 到 100 之間的隨機數(shù),然后乘 A1 中的隨機數(shù),再除以 100 以確保所求隨機數(shù)在 10 至 100 之間,最后用 Int 函數(shù)取整。
提示:這個方法不能確保絕對不生成重復的隨機數(shù),當每次生成的隨機數(shù)有兩組完全相同時,同樣會生成重復的隨機數(shù)。例如,A2 和 B2 生成的隨機數(shù)與 A5 和 B5 生成的隨機數(shù)相同,那么 B2 = A2 × RAND() 等于 B5 = A5 × RAND(),則在 B2 與 B5 生成的隨機數(shù)相同。
(二)方法二:用公式生成準確不重復隨機數(shù)
1、假如要生成 1 到 10 之間的不重復隨機數(shù)。把公式 =SMALL(IF(COUNTIF($A$1:A1,ROW($1:$10))=0,ROW($1:$10)),INT(RAND()*(10-ROW(1:1))+1)) 復制到 A2 單元格,按 Ctrl + Shift + 回車,則生成一個 1 到 10 之間的不重復隨機數(shù);把鼠標移到 A2 的單元格填充柄上并往下拖,然后保存,則生成 1 到 10 之間的其它不重復隨機數(shù);操作過程步驟,如圖6所示:
圖6
2、公式說明
A、$A$1:A1 中的 $A$1 表示絕對引用,A1 表示相對引用,即往下拖時,$A$1 始終不變,A1 則會變?yōu)?A2、A3 等。
B、ROW($1:$10) 是對一組單元格的引用,返回一個 1 到 10 的數(shù)組,即 {1;2;3;4;5;6;7;8;9;10}。
C、ROW(1:1)是對一個單元格的引用,返回一個一行一列的數(shù)組,往下拖時會變?yōu)?ROW(2:2)、ROW(3:3) 等。
D、用公式求值查看公式執(zhí)行過程
選中 A2 單元格,選擇“數(shù)據(jù)”選項卡,單擊“公式求值”,打開“公式求值”窗口,單擊一次“求值”,則計算一步。第一次單擊“求值”,把公式中的 ROW($1:$10) 變?yōu)?{1;2;3;4;5;6;7;8;9;10},
E、逆向解析公式執(zhí)行過程
1)公式執(zhí)行到最后一步變?yōu)?=SMALL({1;2;3;4;5;6;7;8;9;10},8},如圖8所示:
圖8
2)公式 =SMALL({1;2;3;4;5;6;7;8;9;10},8} 的意思是:從數(shù)組 {1;2;3;4;5;6;7;8;9;10} 中找出第8小的數(shù),即為 8;也就是說前面步驟所要做的工作就要生成數(shù)組 {1;2;3;4;5;6;7;8;9;10} 和生成序號 8。
3)IF(COUNTIF($A$1:A1,ROW($1:$10))=0,ROW($1:$10)) 負責生成數(shù)組 {1;2;3;4;5;6;7;8;9;10},INT(RAND()*(10-ROW(1:1))+1) 負責生成序號 8。
4)COUNTIF($A$1:A1,ROW($1:$10) 是統(tǒng)計數(shù)組 {1;2;3;4;5;6;7;8;9;10} 每個元素在 A1 中出現(xiàn)的個數(shù),A1 單元格為空,因此,統(tǒng)計結果全為 0,即{0;0;0;0;0;0;0;0;0;0},如圖9所示:
圖9
再看 A4 單元格中的同樣步驟(選中 A4,打開“公式求值”窗口,點“求值”一直到與圖9一樣的步驟),第 1、3 個元素為 1,即 {1;0;1;0;0;0;0;0;0;0},為什么第 1、3 個元素為 1,其它元素為 0?,因為 1 和 3 已經(jīng)生成了隨機數(shù),即 A2 和 A3 中的隨機數(shù),如圖10所示:
圖10
繼續(xù)往后執(zhí)行,1 會變?yōu)?False,0 會變 True,如圖11所示:
圖11
也就是為 False 的,就不會再從 ROW($1:$10)(即 {1;2;3;4;5;6;7;8;9;10})返回元素,如圖12所示:
圖12
當用 Small 從{False;2;False;3;4;5;6;7;8;9;10} 返回元素時,只從數(shù)字中返回,F(xiàn)alse 將被忽略。
5)RAND()*(10-ROW(1:1))+1 表示生成 1 到 10 之間的隨機,可參照 Rand() 生成指定范圍(a 到 b)的隨機數(shù)公式 RAND()*(b-a) + a;最后用 Int函數(shù)取整。
3、如果要生成 10 到 100 之間的不重復隨機數(shù),公式可以這樣寫:
=SMALL(IF(COUNTIF($A$10:A10,ROW($10:$100))=0,ROW($10:$100)),INT(RAND()*(90-ROW(10:10))+1)),如圖13所示:
圖13
按 Ctrl + Shift + 回車,則生成一個 10 到 100 之間的隨機數(shù),用往下拖的方法生成其它 10 到 100 之間的隨機數(shù),結果如圖14所示:
圖14
注意:把公式復制到 A11 單元格和公式中修改的項,如 $A$10:A10、ROW($10:$100) 和 90-ROW(10:10)。