【发布时间】:2016-12-23 02:47:00
【问题描述】:
此语句通常可以成功生成 3 个唯一的随机数,但有时它只生成 2 个唯一的数字。
rand(1:length(matches), 3)
我该如何重写它,以确保始终生成 3 个唯一的随机数。 (我也愿意使用其他功能等)
谢谢
【问题讨论】:
-
仅供参考,理想情况下,您不应使用未在问题中定义的变量(即匹配项)。不过在这里没关系。
此语句通常可以成功生成 3 个唯一的随机数,但有时它只生成 2 个唯一的数字。
rand(1:length(matches), 3)
我该如何重写它,以确保始终生成 3 个唯一的随机数。 (我也愿意使用其他功能等)
谢谢
【问题讨论】:
StatsBase 中的示例函数有一个replace 选项。
例如
using StatsBase
sample(1:10, 3, replace=false)
【讨论】:
简单的答案:(下面有更完整的解释)
using StatsBase
MyRand = sample(1:10, 3, replace = false)
可能有很多复杂的情况。例如,每当绘制随机数时,总会有一些分布从中抽取。如果您正在绘制许多随机数,那么统计学中对此的通常描述是您正在从多维分布中绘制。如果您的分布是离散的(即任何特定数字都有被选中的正概率),如果您指定没有两个条目可以彼此相等,那么它实际上将是一个不同的分布。因此,根据您的具体需求,这可能会相对较快地变得相对复杂。例如。如果您想要 5 个泊松随机变量,但规定没有两个彼此相等 - 在代码中完成此操作相对简单,但会产生此问题的分布细节更复杂,您绘制的变量将不再是标准泊松随机变量。根据您的应用程序,这可能对您来说很重要,也可能不重要。
但是,在这种情况下,您似乎只是想从某种列表中选择三个随机元素,为每个被选中的元素分配相等的概率,并确保没有元素被选中两次。在这种情况下,来自 StatsBase 的 sample() 函数可以解决问题,选择 replace = false 选项(即“无替换”抽样意味着一旦选择了可能结果池中的数字)。
【讨论】:
嗯,这取决于 length(matches) 的数量。
我建议你可以尝试这三种方法来找到一种时间成本最低的方法:
n = length(matches)
using Random
shuffle(1:n)[1:3]
randperm(n)[1:3]
using StatsBase
sample(1:n, 3, replace=false)
【讨论】: