【问题标题】:Create Javascript Array With 2 Unique Numbers创建具有 2 个唯一数字的 Javascript 数组
【发布时间】:2012-08-29 21:36:40
【问题描述】:

我正在尝试执行以下操作:

创建两个在特定范围内且至少比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??
            }
        }

    }

}

但这会随机使浏览器崩溃,而且当数字太接近时,我也不知道重新启动循环的好方法......

【问题讨论】:

    标签: javascript loops for-loop each


    【解决方案1】:

    您可以分两步完成。

    1. 生成您的第一个随机数。
    2. 将随机数池减少到唯一可能的有效值。
    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)];
    

    jsFiddle.

    它可能比随机选择和比较慢,但至少它有保证的运行时间:)

    【讨论】:

    • 这很好用 :) 非常感谢您为包含示例所做的努力!
    • 不过,这将需要线性时间和线性内存来存储。
    【解决方案2】:

    您可以移动不选择数字的间隙,即在 0 和 range - gap 之间选择一个随机数 x,而不是在 0x 之间选择第一个和第二个在x + gaprange 之间。这样会更有效率。

    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) 中工作。

    【讨论】:

    • 这似乎返回了巨大的数字,这些数字不在第二个数字的范围内......但也许我在将它应用到我的示例时犯了一个错误。
    • @Qnan 现在工作得很好!但是我不确定是否使用这个或 alex 的解决方案,因为我没有足够的经验知道什么更有效。
    • @Andrej 他们在做大致相同的事情,但我建议我的更高效、更简洁。
    • 确实更简洁,我立刻明白了它在做什么。我会更改标记的答案 - 我相信亚历克斯不会介意。
    • @Andrej 确实这个效率更高。
    【解决方案3】:

    简单地尝试一下怎么样?非常容易,当差异远小于最大尺寸(例如 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 个数字要生成时,这无关紧要!

    【讨论】:

      猜你喜欢
      • 2019-03-24
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多