图8
B、公式=SMALL(IF(COUNTIF(A$1:A1,ROW($1:$12))=0,ROW($1:$12)),INT(RAND()*(12-ROW(1:1)) 1)) 说明:
[1]、A$1 表示对列相对引用、对行绝对引用($ 表示绝对引用),当往下拖时,A1 不会变为 A2、A3 等;当往右拖时,A1 会变为 B1、C1 等。A1 表示对列和行都是相对引用,当往下拖时,A1 会变为 A2、A3 等;当往右拖时,A1 会变为 B1、C1 等。
[2]、A$1:A1 用于返回当前单元格到拖到单元格的所有数值;当公式在 A2 时,A$1:A1 返回 A1,A1 为空,因此返回 0;当公式在 A3 时,A$1:A1 变为 A$1:A2,它以数组形式返回 A1、A2 中的数值,即返回 {0;5};其它的以此类推。
[3]、$1 表示对行的绝对引用,当往下拖时,1 不会变为 2、3 等;$12 与 $1 是一个意思;ROW($1:$12) 用于返回 1 到 12 的数组,即返回 {1;2;3;4;5;6;7;8;9;10;11;12}。
[4]、当公式在 A2 时
COUNTIF(A$1:A1,ROW($1:$12)) 变为 COUNTIF(A1,{1;2;3;4;5;6;7;8;9;10;11;12}),A1 为统计个数的范围,数组为条件,执行时,依次取条件数组中的每个元素统计在 A1 中出现的次数,第一次执行取条件数组的第一个元素 1,由于 A1 的数值为 0,因此统计结果为 0;第二次执行取 2,统计结果也为 0;其它的以此类推;最后返回 {0;0;0;0;0;0;0;0;0;0;0;0};
则 COUNTIF(A$1:A1,ROW($1:$12))=0 变为 {0;0;0;0;0;0;0;0;0;0;0;0}=0,接着,取数组中的每个元素与 0 比较,如果相等,返回 True,否则返回 FALSE,最后返回 {TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE};
则 IF(COUNTIF(A$1:A1,ROW($1:$12))=0,ROW($1:$12)) 变为 IF({TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE},
{1;2;3;4;5;6;7;8;9;10;11;12}),执行时,依次取 IF 条件数组中的每个元素出来,如果为 True,返回第二个数组与之对应的元素,否则返回 False;由于条件数组中全为 True,因此返回 {1;2;3;4;5;6;7;8;9;10;11;12};
1:1 表示对行的相对引用,往下拖时,1:1 会变为 2:2、3:3 等;ROW(1:1) 返回第一行的行号 1;12-ROW(1:1) 返回 11,12 是生成指定范围随机数的上限;
RAND() 用于返回 0 到 1 的小数随机数,假如它返回 0.401319158944677,则 INT(RAND()*(12-ROW(1:1)) 1) 变 INT(0.401319158944677*11 1),进一步计算变为 INT(4.414510748391450 1),接着,用 Int 函数取整,结果为 5;
则公式变为 =SMALL({1;2;3;4;5;6;7;8;9;10;11;12},5),最用 Small 函数返回数组中第 5 个最小的数,即返回 5。
[5]、公式在 A3 时
COUNTIF(A$1:A2,ROW($1:$12)) 变为 COUNTIF(A$1:A2,{1;2;3;4;5;6;7;8;9;10;11;12}),执行时,同样依次取条件数组中的每个元素统计在 A1:A2 中的个数,由于 A1 为 0,A2 为 5,因此 A1:A2 返回 {0;5};第一次执行取条件数组中的 1,由于数组 {0;5} 中没有 1,因此返回 0;第二次取 2,同样返回 0;其它的以此类推,最后返回 {0;0;0;0;1;0;0;0;0;0;0;0};
则 COUNTIF(A$1:A2,ROW($1:$12))=0 变为 {0;0;0;0;1;0;0;0;0;0;0;0}=0,计算结果为{TRUE;TRUE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE};
则 IF(COUNTIF(A$1:A2,ROW($1:$12))=0,ROW($1:$12)) 变为 IF({TRUE;TRUE;TRUE;TRUE;FALSE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE},{1;2;3;4;5;6;7;8;9;10;11;12}),进一步计算返回 {1;2;3;4;FALSE;6;7;8;9;10;11;12};剩余步骤与公式在 A2 时一样。
C、如果要生成其它范围的随机数(如 5 到 10 的随机数),只需把上面的公式改一下即可,公式可以这样写:
=SMALL(IF(COUNTIF(B$5:B5,ROW($5:$10))=0,ROW($5:$10)),INT(RAND()*(10-ROW(5:5)) 1))
把公式复制到 B6,按回 Ctrl Shift 回车,生成一个随机数,然后用往下拖的方法一直拖到 B11,按 Ctrl S 保存,则生成 5 到 10 的不重复随机数;操作过程步骤,如图9所示:
图9
,