【发布时间】:2015-04-17 01:13:22
【问题描述】:
我想在不替换的情况下绘制随机整数对(换句话说,我不想要任何重复的对)。这个概念听起来很简单,但我想不出一个快速简单的解决方案。
想象一下,例如,我想使用整数序列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 中绘制大量对时,它就不是很好了。
【问题讨论】:
-
你如何得到{3,3} 没有替换
-
您打算从中提取每个数字的序列到底有多大?真的是1e7吗?
-
rawr - 我基本上从中绘制的集合是 (1,1),(2,1),(1,2),(1,3),(1,4),( 2,2) 等...所以没有替换基本上意味着我永远不会有重复的对。那有意义吗?关于如何改写问题以使其更清晰的任何建议?
-
BrodieG,我正处于一个项目的开始阶段,所以我不确定序列会有多大,可能不是 1e7。但比 4 更接近 1e7。
-
你可以通过直接计算行和列来提高最后一行计算
r.pair的性能,一个常数时间的操作,代替线性时间的操作which:行是@987654327 @ 并且列为as.integer((x-1)/4)+1L,其中x与sapply调用中的函数相同。
标签: r random-sample