发布网友 发布时间:2022-05-05 15:38
共3个回答
热心网友 时间:2022-06-27 17:04
本问题有两个难点:第一个是随机函数是易失性函数,生成后的随机数字会在工作表有任何操作时再次重新生成,不能固定,这一难点在本人回答的若干随机数问题中,已给出了*的解决方法——就是要打开Excel的迭代计算,并在公式中用IF编写好循环引用。第二个是本问题特有的两两相差最小为2这个条件,这在公式中是比较难解决的,解决的方法是构建已知数据和它的转置矩阵相减,但计算量相当大。好在只有5个数字,如果数据量大,计算会比较卡的。当然以题主的举例为例,5个数字在100~200共101个数字中随机产生,出现某两个数字相差小于2的可能性极低,基本上可以不用考虑。所以下面的方法中5个随机数在1~11个数字中产生,这就必须考虑控制两两相差最小为2的问题了。
解决问题的步骤:
在选项的公式选项卡中,把“启用迭代计算”打上对勾后确定,以启用迭代。
假设要B1:B5中生产1~11共5个随机数,且两两最小差值不能小于2。要达到这个目的,要设置一个触发单元格,现在选择A1——当A1中不输入数据或删除数据后,B1:B5中为数字0,当A1中输入任何内容时,B1:B5产生所需要的随机数字:
B1=IF(A$1="",0,IF(OR(B1=0,COUNTIF(B$1:B$5,B1)>1,MIN(ABS(IF(ROW($1:$5)=COLUMN($A:$E),3,$B$1:$B$5-TRANSPOSE($B$1:$B$5))))=1),RANDBETWEEN(1,11),B1))
同时按Ctrl+Shift+Enter三键输入数组公式,下拉到B5
现在A1中没有数据,IF条件为真,B1:B5为0,如图
在A1中随意输入数据(任何字符或数字),IF条件为假,第2个IF因为B1:B5=0,为真,OR条件肯定为真,B2:B5均生成随机数字,这时如果有任意重复数字,OR条件的第2个将为真,或者OR条件的第3个计算两两差值中存在小于2的,均导致OR条件成立,再次重新生成随机数,直到OR条件中全部为假,OR条件才不成立,执行第2个IF的第3参数,取得单元格本身——这就是Excel中的循环引用——所以输入公式前要进行步骤1的设置——启用迭代计算。B1~B5所有已取得的数字的单元格同样不再发生变化。如图
要重新生成随机数时,只要删除A1中的内容,使B列填充了公式的单元格重新初始化——取得一个空格,再在A1中输入数据即可。
PS:本方法计算量大,仅5个数字的取得即可明显感觉到Excel的停顿,如果数据量大,建议考虑VBA。
追答也可以OR条件中的第2个并入第3个条件中,因为第3个条件中已将单元格自身的差值强制赋值为3,这样只要把第3个条件中的=1以为<2即可——为0时重复。
热心网友 时间:2022-06-27 17:05
还是用代码最理想:
代码如下:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)追问能不能把这个代码改成行生成那,而且我需要30行,只要每一行满足条件就行,本人代码小白,麻烦给解读一下,谢谢了。
追答Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i, j, k
For k = 1 To 30
Cells(k, 1) = Application.WorksheetFunction.RandBetween(100, 200)
For i = 2 To 5
Do
Cells(k, i) = Application.WorksheetFunction.RandBetween(100, 200)
For j = 1 To i - 1
t = Abs(Cells(k, i) - Cells(k, i - j))
If t < 2 Then Exit For
Next j
Loop Until t > 1
Next i
Next k
End Sub
热心网友 时间:2022-06-27 17:05
伤脑筋,明明相差了不知道有多少个2了。