我随机填写10x10 martix(mat
),直到sum(mat) == 100
我写了以下内容....(i = 2
的原因还没有在此指定,但我保留在2
以与我的实际代码保持一致)
mat <- matrix(rep(0, 100), nrow = 10)
mat[1,] <- c(0,0,0,0,0,0,0,0,0,1)
mat[2,] <- c(0,0,0,0,0,0,0,0,1,0)
mat[3,] <- c(0,0,0,0,0,0,0,1,0,0)
mat[4,] <- c(0,0,0,0,0,0,1,0,0,0)
mat[5,] <- c(0,0,0,0,0,1,0,0,0,0)
mat[6,] <- c(0,0,0,0,1,0,0,0,0,0)
mat[7,] <- c(0,0,0,1,0,0,0,0,0,0)
mat[8,] <- c(0,0,1,0,0,0,0,0,0,0)
mat[9,] <- c(0,1,0,0,0,0,0,0,0,0)
mat[10,] <- c(1,0,0,0,0,0,0,0,0,0)
i <- 2
set.seed(129)
while( sum(mat) < 100 ) {
# pick random cell
rnum <- sample( which(mat < 1), 1 )
mat[rnum] <- 1
##
print(paste0("i =", i))
print(paste0("rnum =", rnum))
print(sum(mat))
i = i + 1
}
出于某种原因sum(mat) == 99
有几个额外的步骤...我会假设i = 91
while
一旦while( sum(mat) < 100 & length(which(mat < 1)) > 0 )
停止,但它会继续经过这个。可以解释我做错了什么......
如果我将while条件更改为
{{1}}
问题仍然存在..
答案 0 :(得分:2)
您的问题等同于随机排序矩阵的索引等于0.您可以使用sample(which(mat < 1))
在一行中执行此操作。我想如果你想获得完全相同的输出,你可以尝试类似的东西:
set.seed(144)
idx <- sample(which(mat < 1))
for (i in seq_along(idx)) {
print(paste0("i =", i))
print(paste0("rnum =", idx[i]))
print(sum(mat)+i)
}
# [1] "i =1"
# [1] "rnum =5"
# [1] 11
# [1] "i =2"
# [1] "rnum =70"
# [1] 12
# ...
答案 1 :(得分:1)
请参阅?sample
Arguments:
x: Either a vector of one or more elements from which to choose,
or a positive integer. See ‘Details.’
...
If ‘x’ has length 1, is numeric (in the sense of ‘is.numeric’) and
‘x >= 1’, sampling _via_ ‘sample’ takes place from ‘1:x’. _Note_
that this convenience feature may lead to undesired behaviour when
‘x’ is of varying length in calls such as ‘sample(x)’. See the
examples.
换句话说,如果x
中sample(x)
的长度为1,sample
会从1:x
返回一个随机数。这发生在循环结束时,矩阵中只剩下一个0,which(mat < 1)
返回一个索引。
答案 2 :(得分:1)
迭代在99级重复,因为sample()
在第一个参数是长度为1的向量且大于1的向量时表现非常不同。当长度为1时,它假定您从1开始随机数那个数字。如果长度> 1,则从该向量中获取一个随机数。
比较
sample(c(99,100),1)
和
sample(c(100),1)
当然,这是一种填充矩阵的低效方法。正如@josilber指出的那样,只需拨打一次sample
即可完成您需要的一切。
答案 3 :(得分:0)
当您只有一个&#39; 0&#39;剩下的价值。
例如,执行此操作:
sample
现在你有一个所有1的矩阵。现在让我们制作两个数字0:
which
然后示例
mat <- matrix(rep(1, 100), nrow = 10)
通过添加mat[15]<-0
mat[18]<-0
参数,您可以获得一个或另一个
现在让我们试试这个:
sample(which(mat<1))
[1] 18 15
哎呀,你没有得到size=1
。相反,仅在一个整数中发生的事情(在这种情况下为15)传递给mat[18]<-1
sample(which(mat<1))
[1] 3 13 8 2 4 14 11 9 10 5 15 7 1 12 6
。如果[1] 15
和sample
是一个整数,它会以sample(x)
为例,以随机顺序为整数提供样本。