这个语句通常能够成功生成3个不同的随机数,但有时它只能生成2个不同的随机数。
rand(1:length(matches), 3)
我该如何改写这段代码以确保始终生成3个唯一的随机数。(如果需要,我可以使用其他函数等)
谢谢
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)