在Julia中生成唯一的随机数

13

这个语句通常能够成功生成3个不同的随机数,但有时它只能生成2个不同的随机数。

rand(1:length(matches), 3)

我该如何改写这段代码以确保始终生成3个唯一的随机数。(如果需要,我可以使用其他函数等)

谢谢


2
FYI 最理想的做法是不要使用在问题中未定义的变量(例如 matches)。但在这里并不太重要。 - Alexander Morley
2
请参考以下链接:https://dev59.com/cloV5IYBdhLWcg3wmPtH#36048024 - amrods
3个回答

13

10

简单回答:(更详细的解释见下文)

using StatsBase
MyRand = sample(1:10, 3, replace = false)   

这其中涉及到很多可能会复杂化的情况。例如,每当随机抽取数字时,总是从某个分布中抽取。如果你要抽取很多随机数,那么通常在统计学中所描述的是从一个多维分布中进行抽取。如果你的分布是离散的(即任何特定数量都有被选中的正概率),那么如果你规定没有两个条目可以相等,它实际上将成为另一个分布。因此,具体取决于你想要什么,这可能会相对迅速地变得比较复杂。例如,如果你想要5个泊松随机变量,但要求它们中没有两个相等——要在代码中实现这一点相对容易,但生成这种分布的具体细节更加复杂,而你抽取的变量将不再是标准的泊松随机变量。根据你的应用程序,这可能或可能不重要,需要牢记。

但是,在这种情况下,看起来你只是想从某种列表中选择三个随机元素,给每个元素选择相等的概率,并确保没有元素被选中两次。在这种情况下,StatsBase的sample()函数将达到预期效果,以选择replace=false选项(即“无放回抽样”,意味着一旦选中一个数就从可能结果的池中移除)。


0

这取决于length(matches)的数量。

我建议您尝试以下三种方法,以找到一个时间成本最小的:

    n = length(matches)
    using Random
    shuffle(1:n)[1:3]
    randperm(n)[1:3]

    using StatsBase
    sample(1:n, 3, replace=false)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接