创建具有2个唯一数字的Javascript数组
Create Javascript Array With 2 Unique Numbers
我正在尝试执行以下操作:
创建两个唯一的数字,它们都在一定的范围内,并且它们至少大/小n
。
例如:
范围为0-600最小"差值"为150
因此生成的数字可以是:[2400],[120310],[82530]
但不是[900400]或[200220]。
这就是我目前所拥有的:
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??
}
}
}
}
但这会随机导致浏览器崩溃,而且当数字太接近时,我不知道重启循环的好方法。。。
您可以通过两个步骤来完成此操作。
- 生成您的第一个随机数
- 将随机数池减少到唯一可能的有效值
- 在减少的池中选择下一个随机数
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)];
jsFiddle。
它可能比随机选择和比较慢,但至少它有一个有保证的运行时间:)
您可以改变不选择数字的间隔,即在0和range
-gap
之间选择一个随机数x
,而不是在0
和x
之间选择第一个,在x + gap
和range
之间选择第二个。这样会更有效率。
var range = 600, gap = 150;
var x = Math.floor(Math.random() * (range - gap));
var posX = (Math.random() * (x)).toFixed();
var posY = (Math.random() * (range - x - gap) + x + gap).toFixed();
在O(1)中工作。
简单地尝试一下怎么样?非常容易,当差异比最大尺寸(例如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个数字要生成时,这无关紧要!
相关文章:
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 将Javascript数组发送到控制器ASP.NET MVC
- JavaScript数组包含一个值
- 将JavaScript数组传递给函数
- javascript:数组循环
- 将数据存储在javascript数组中以供进一步使用
- 在Javascript数组中查找绝对最大值
- JavaScript数组优化以提高性能
- 在javascript数组中分散数字
- 如何发送分配列表<字符串>到JavaScript数组或可枚举对象
- Javascript数组动态
- javascript数组元素是否知道其封闭数组
- 将 JSON 数组解析为 JavaScript 数组
- 将Transform和Instance Variable转换为对象的JavaScript数组
- 使用Web Html表单创建Javascript数组
- 从重复的javascript数组结果集中只获取一行
- 如何为Javascript数组()的使用准备PHP变量
- Javascript数组和函数
- 为DataTables aoColumnDefs创建JavaScript数组(JSON格式)