I don't understand the "minimum distance" thing you mentioned. Here's how to generate 1000 points uniformly within cells but with the number in each cell weighted by the cell value: Make a test 3x4 raster with some positive random numbers: > set.seed(12) > r = raster(matrix(runif(12),3,4)) Get the cell half-width for later: > hs = res(r)/2 Now work out which cell each of our 1000 points is going in by sampling from the number of cells (12) with replacement, weighted by the value in the cells: > ptscell = sample(1:12, 1000, prob=r[], replace=TRUE) Now find the centre of those 1000 cell numbers: > centres = xyFromCell(r,ptscell) And generate random uniform points in the cell by using the centre and the half-width/height from earlier: > pts = cbind(runif(nrow(centres),centres[,1]-hs[1],centres[,1]+hs[1]),runif(nrow(centres),centres[,2]-hs[2],centres[,2]+hs[2])) Voila: > plot(r) > points(pts)