Я хочу нарисовать случайные целые пары без замены (иначе я не хочу дублировать пары). Эта концепция звучит просто, но я не могу придумать быстрое и простое решение.
Представьте, например, что я хочу генерировать случайные пары целых чисел, используя последовательность integer 1:4
, чтобы заполнить элементы пары. Также предположим, что я хочу сгенерировать 5 случайных пар без замены. Затем я хочу иметь возможность генерировать что-то вроде этого...
[,1] [,2]
[1,] 1 2
[2,] 2 1
[3,] 3 3
[4,] 1 4
[5,] 4 3
В приведенном выше примере нет повторяющихся пар (например, строк). Однако в каждом столбце вышеуказанной матрицы есть повторяющиеся целые числа. Следовательно, использование sample()
для генерации случайного числа для каждого столбца отдельно не будет работать.
Другое потенциально потенциальное решение, которое не будет работать для моего контекста, состоит в создании множества пар, которые включают дубликаты, а затем удаляют эти дубликаты ретроактивно. Я не могу этого сделать, потому что мне нужно будет генерировать определенное количество пар.
Я ищу эффективное решение этой проблемы. Это похоже на такой простой вопрос, оно должно иметь простое решение (т.е. Не нужно встраивать петли)
Вот мой уродливый подход:
#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, это не так уж хорошо.