选项 1 - 使用 IF 检查重复项

选项 1 - 使用 IF 检查重复项

我正在尝试创建一个与网站上的选择优先级相对应的随机值表。基本上是尝试先发制人地做一些猜测。

本质上我想要做的是知道如何生成 1-4 之间的随机数,并且在同一行中不能两次得到相同的数字。最好不是易变的,但如果每次计算时都重新计算,我可以处理它。

例如,我想生成 4 列中 1-4 之间的值,因此一列有 1,一列有 3,一列有 2,一列有 4。

我试过 Randbetween() 函数,但遗憾的是,它允许重复。如果有 Distinct(Randbetween()) 之类的东西,那将解决我的问题。

有什么建议吗?谢谢。

答案1

如果您愿意坚持一到四的范围,您可以通过在辅助数组中设置所有 24 个选项,然后随机选择一个选项来实现。

在 Sheet2 的单元格 A1 至 B24 中,放置以下内容:

1   1234
2   1243
3   1324
4   1342
5   1423
6   1432
7   2134
8   2143
9   2314
10  2341
11  2413
12  2431
13  3124
14  3142
15  3214
16  3241
17  3412
18  3421
19  4123
20  4132
21  4213
22  4231
23  4312
24  4321

这就是 1234 的 24 种可能排列,也就是无需替换即可选择数字 1 到 4 的所有可能方式。

然后,返回 Sheet1。在 A1 中输入以下公式:

=INT(RAND()*24)+1

(我这样做是因为我正在使用的 Excel 版本太旧,没有该RANDBETWEEN功能。但您也可以使用=RANDBETWEEN(1,24)。)

然后,在 B1 中输入:

=VLOOKUP(A1,Sheet2!A$1:B$24,2,FALSE)

这将在 Sheet2 上的数组中查找。它将在第一列中查找 A1 中的值(1 到 24 之间的随机数),并返回第二列中的值(1234、1243、1324 等)。

然后,在 C1 到 F1 中输入以下内容:

C1:   =MID($B1,1,1)
D1:   =MID($B1,2,1)
E1:   =MID($B1,3,1)
F1:   =MID($B1,4,1)

这会将 B1 中的四位数字分解为其组成部分。因此,现在 C1 至 F1 将包含数字 1 至 4,顺序随机,没有重复。

警告

这不太好扩展。Sheet2 上的辅助数组需要有不!行,其中 N 是您想要的值的数量。而且增长很快。如果您想要 1 到 7 之间的随机数,则辅助数组中需要 5,040 行。但如果您只想对 1 到 4 之间的随机数执行此操作,这是可以管理的。

答案2

随机函数在设计上可以产生重复——否则它们不会被考虑随机的.你需要的是随机排序的数字列表. 从列表中生成数字的一种简单方法随机顺序是使用数组。例如,要以非重复随机顺序生成一副牌中牌值的数字 1 到 13:

  1. 创建一个数字数组,1.. 13。(好吧,对于纯粹主义者来说,0.. 12 ;-)
  2. 在数组中的每个位置插入项目编号,这样数组现在按顺序保存值 1 到 13。
  3. 现在遍历数组,将每个值与随机项的值交换,1..13。

数组现在将保存全部 13 个数字,但顺序随机……没有缺失或重复。

这可以用一个非常小的宏来完成。

答案3

在辅助行的帮助下,并意识到这只是 4 个没有重复的数字,你可以使用以下两个中的一个不那么优雅解决方案:

在 A1 中放置以下公式并将其复制到左侧 4 列(以 D1 结尾):

=RANDBETWEEN(1,4-(COLUMN(A1)-1))

基本上,它将创建一个递减范围的随机数。它遵循这样的原则:如果你有一袋 4 个球,你抽出一个,那么下次你抽球时,可供选择的球就少了 1 个,所以只有 3、2、1、0。它没有解决重复的问题。这样做的另一个原因是,一旦易变的结果出现在页面上,它们就不会重新计算,除非页面/表格上的内容发生变化。这意味着在重新计算之前,它们对于其他公式来说是静态的。

下一个不太优雅的步骤是检查重复。当出现重复时,您需要加 1。这是在加 1 后需要重复检查的,以防新数字也是重复的。因此,对于要处理的少量整数,可以用几种方法来完成,但是开始获得远远超过 5 个整数,公式就会变得难以控制。

由于第一位数字不能重复,因此只需让 A2 中的公式指向 A1。

=A1

选项 1 - 使用 IF 检查重复项

在 B2 中放置以下公式并复制到右侧:

=IF(COUNTIF($A$2:A2,B1)=1,IF(COUNTIF($A$2:A2,B1+1)=1,IF(COUNTIF($A$2:A2,B1+2)=1,3,2),1),0)+B1

现在从技术上讲,对于 B2,您只需要上述公式的一部分,但是当您复制到右侧时,或者相反,随着您要处理的整数数量增加,您需要嵌套一个额外的 IF 函数。此公式适用于最终情况,并使您免于在每一列中都使用自定义公式。

自定义公式模式从 A2 到 D2 如下所示:

=A1
=B1+IF(COUNTIF($A$2:A2,B1)=1,1,0)
=C1+IF(COUNTIF($A$2:B2,C1)=1,IF(COUNTIF($A$2:B2,C1+1)=1,2,1),0)
=D1+IF(COUNTIF($A$2:C2,D1)=1,IF(COUNTIF($A$2:C2,D1+1)=1,IF(COUNTIF($A$2:C2,D1+2)=1,3,2),1),0)

选项 2 - 添加所有真实结果

此解决方案与上述解决方案类似,但它删除了 IF 并直接进入数学部分。为了演示目的,我在第三行放置了以下等式。再次从 A 列开始,将其指向 A1 以获取该初始值,然后在 B 列开始查看重复项。

=B1+(COUNTIF($A$2:A2,B1)=1)+(COUNTIF($A$2:A2,B1)=1)*(COUNTIF($A$2:A2,B1+1)=1)+(COUNTIF($A$2:A2,B1)=1)*(COUNTIF($A$2:A2,B1+1)=1)*(COUNTIF($A$2:A2,B1+2)=1)

这又是最终的情况。注意模式思维。每个 + 之后都会添加一个新的 countif,并将其乘以前一个 + 之前的结果。因此,如果您想使用自定义公式,从 A3 到 D3 的模式如下:

=A1
=B1+(COUNTIF($A$2:A2,B1)=1)
=C1+(COUNTIF($A$2:B2,C1)=1)+(COUNTIF($A$2:B2,C1)=1)*(COUNTIF($A$2:B2,C1+1)=1)
=D1+(COUNTIF($A$2:C2,D1)=1)+(COUNTIF($A$2:C2,D1)=1)*(COUNTIF($A$2:C2,D1+1)=1)+(COUNTIF($A$2:C2,D1)=1)*(COUNTIF($A$2:C2,D1+1)=1)*(COUNTIF($A$2:C2,D1+2)=1)

如您所见,随着添加更多整数,公式将会很快扩大。可能会很快开始进入公式限制中允许的字符数。

波克

答案4

我需要在同一行中选择 1、2 或 3,并且不重复数字。为此,您可以在第一列中使用 RANDBETWEEN 1 and 3,然后在接下来的两列中查看前几列并使用 CHOOSE。E2 列中的第一个公式

=RANDBETWEEN(1,3)
=IF(E2=1,CHOOSE(E2+1,1,2),CHOOSE(E2-1,1,2))
=IF(SUM(E2:F2)=5,1,IF(SUM(E2:F2)=3,3,2))

相关内容