-2

我有一个我认为很有趣的问题,希望有人能回答。

我在 excel 中使用 randbetween 公式随机生成大约 1300 个数字。我希望这些数字是非重复的,所以我创建了一个列来计数……如果计数的总和等于我试图生成的确切数字(1300),则另一个单元格中的语句会说停止。我正在使用“直到循环”来刷新屏幕,直到单元格显示“停止”。

你知道,从统计上看,这需要多长时间?

A 列 =IF(R2="C",RANDBETWEEN(1,1364),"")

B 列 =IF(A2<>" ",COUNTIF(A:A,A2)," ")

单元格 C2 =IF(SUM(B:B)>1364,"LOOP","STOP")

Sub Refresh()

Do Until Range("C2").Value = "STOP"
    Sheets("2").Calculate  
Loop

End Sub

谢谢你。

4

2 回答 2

1

您可以偶然计算出这种情况发生的概率。

例如:选择 1 到 1364 之间的随机数,第一个数字唯一的概率是 1364/1364=1(正如预期的那样!)第二个数字唯一的机会略小(因为其中一个可能的结果已经选择),即。1363/1364 = 大约 0.9993,等等……

要计算累积概率,请将所有概率相乘。起初这看起来并不算太糟糕,但是随着被选择的值数量的增加,它们都是唯一的累积概率变得非常小!

Number#    Fav. outcomes   Poss. outcomes   Proab.(F/P)  CumulativeProb.
1             1364          1364              1              1 
2             1363          1364          0.9993        0.999266862170088 
 3             1362          1364          0.9985        0.997801661492419 
 4             1361          1364          0.9978        0.995607083058052 
 5             1360          1364          0.9971        0.992687414192779 
 6             1359          1364          0.9963        0.989048530709667 
 7             1358          1364          0.9956        0.984697877348775 
 8             1357          1364          0.9949        0.979644442494345 
 9             1356          1364          0.9941        0.9738987272891 
 100           1265          1364          0.9274        2.42184294266298E-02 
 200           1165          1364          0.8541        2.1388864198042E-07 
 300           1065          1364          0.7808        3.48483477273297E-16 
 400           965           1364          0.7075        4.65969192062002E-29 
 500           865           1364          0.6342        1.92148262885009E-46 
 600           765           1364          0.5609        7.31144974750256E-69 
 700           665           1364          0.4875        5.58849715194661E-97 
 800           565           1364          0.4142        1.17499140301415E-131 
 900           465           1364          0.3409        4.55604356381877E-174 
 1000          365           1364          0.2676        6.66544033524014E-226 
 1100          265           1364          0.1943        8.31996777956565E-290 

所以你可以看到它可能需要很长时间......

编辑:布拉德有实际的解决方案:我只是想弄清楚原始方法可能需要多长时间才能成功(这不适合评论)

于 2013-07-19T20:40:54.970 回答
0

这是一种获取许多唯一随机数的方法。然后,如果需要,您可以将该字典放入单元格中。

Dim numbersDic As New Dictionary
Dim i As Single
While numbersDic.Count < 1300
    i = Rnd()
    If Not numbersDic.Exists(i) Then
        numbersDic.Add i, i
    End If
Wend

Dim numbersArr() As Single
ReDim numbersArr(numbersDic.Count)
Dim n As Integer, Key As Variant

For Each Key In numbersDic.Keys
    numbersArr(n) = numbersDic(Key)
    n = n + 1
Next Key

Range("A1:A" & numbersDic.Count - 1).Value = WorksheetFunction.Transpose(numbersArr)

编辑:

重新阅读您的问题后,您似乎想从 [1,1364] 中选择 1300 个随机数。为什么不直接选择 64 个随机数并将它们从您的列表中排除呢?做相反的事情似乎很尴尬。或者您是否尝试制作 1300 个随机数?不考虑范围?

于 2013-07-19T20:45:25.523 回答