我正在尝试做以下事情:
创建两个在一定范围内的唯一数字,它们至少n
更大/更小。
例如:
范围是0-600 最小“差异”是150
所以生成的数字可能是:[2,400],[120,310],[82,530]
但不是[900,400]或[200,220]。
这就是我到目前为止所拥有的:
var posYArray = [];
for(i=0; i < 2; i++){
var posY = (Math.random() * 200).toFixed();
if(i < 1){
posYArray.push(posY);
}else{
for(i=0; i < posYArray.length; i++){
if(posY < posYArray[i]+100){
posYArray.push(posY);
}else{
//Restart loop??
}
}
}
}
但这会随机崩溃浏览器,而且当数字太近时我也不知道重启循环的好方法......
答案 0 :(得分:3)
你可以分两步完成。
var upperBound = 200,
minDelta = 90,
firstRandom = Math.floor(Math.random() * upperBound);
var validPool = [];
for (var i = 0; i < upperBound; i++) {
if (i < firstRandom - minDelta || i > firstRandom + minDelta) {
validPool.push(i);
}
}
var secondRandom = validPool[Math.floor(Math.random() * validPool.length)];
它可能比随机选择和比较慢,但至少它有一个保证的运行时间:)
答案 1 :(得分:1)
你可以改变不选择数字的差距,即在0和x
- range
之间选择一个随机数gap
,而不是在{{1}之间选择第一个}和0
以及x
和x + gap
之间的第二个。那会更有效率。
range
适用于O(1)。
答案 2 :(得分:0)
如果只是尝试它们呢?很容易,当差异小很多时,最大尺寸(例如150和600)你有1/2的可能性很好。
例如:
var posY = (Math.random() * 600).toFixed();
var posX = (Math.random() * 600).toFixed();
while(abs(poX-posY) < 150){
posX = (Math.random() * 600).toFixed()
}
效率不高,但只有2个数字才能生成并不重要!