我希望能够生成不重复的随机整数对(换句话说,我不想有任何重复的整数对)。这个概念听起来很简单,但我想不出一个快速简便的解决方案。
举个例子,假设我想要使用整数序列
在上面的例子中,没有重复的对(即行)。然而,在上述矩阵的每一列中都有重复的整数。因此,仅针对每一列单独使用
另一个看似潜在的解决方案是生成包含重复项的大量对,然后回溯删除这些重复项。但我不能这样做,因为我需要生成特定数量的对。
我正在寻找一个高效的解决方案来解决这个问题。这似乎是一个简单的问题,必须有一个简单的解决方案(即请不要使用嵌套的for循环)。
以下是我的笨拙方法:
举个例子,假设我想要使用整数序列
1:4
生成随机整数对,并且希望生成5个不重复的随机整数对。 那么我想要生成像这样的内容... [,1] [,2]
[1,] 1 2
[2,] 2 1
[3,] 3 3
[4,] 1 4
[5,] 4 3
在上面的例子中,没有重复的对(即行)。然而,在上述矩阵的每一列中都有重复的整数。因此,仅针对每一列单独使用
sample()
来生成随机数将不起作用。另一个看似潜在的解决方案是生成包含重复项的大量对,然后回溯删除这些重复项。但我不能这样做,因为我需要生成特定数量的对。
我正在寻找一个高效的解决方案来解决这个问题。这似乎是一个简单的问题,必须有一个简单的解决方案(即请不要使用嵌套的for循环)。
以下是我的笨拙方法:
#This matrix maps a unique id i.e. (1:16) to a pair (i.e. the row & col of the matrix)
r.mat<-matrix(1:(4*4),4,4)
#Drawing a random id
r.id<-sample(r.mat,5,replace=FALSE)
#Mapping the random id to a random pair
r.pair<-t(sapply(r.id, function (x) which(r.mat==x,arr.ind=TRUE)))
这对于我的玩具示例来说是可以正常工作的,但当我想从序列1:10000000中绘制大量的配对时,情况就不太好了。
r.pair
的性能,这是一个常数时间操作,取代了线性时间操作which
:行是as.integer((x-1)%%4)+1L
,列是as.integer((x-1)/4)+1L
,其中x
与sapply
调用中的函数相同。 - Matthew Lundberg