Javascript 为二维阵列指定唯一编号的更好方法

Javascript 为二维阵列指定唯一编号的更好方法,javascript,arrays,multidimensional-array,shuffle,Javascript,Arrays,Multidimensional Array,Shuffle,我的目标是创建一个2D数组,并在Javascript中为每个数组分配一个从0到n的唯一数字 例如,如果有5行5列,我首先创建一个值数组,其中包含从0到24的数字。然后我想洗牌这些数字,如果数字小于10,则在数组中为该点放置一个“Y”,如果大于或等于10,则放置一个“N”。最终结果应为随机定位的15 N和10 Y 我有下面的代码可以做到这一点,但我发现它真的很低效,我想知道是否有更好的方法来做到这一点 //Define Empty Array test = new Array(rows); fo

我的目标是创建一个2D数组,并在Javascript中为每个数组分配一个从0到n的唯一数字

例如,如果有5行5列,我首先创建一个值数组,其中包含从0到24的数字。然后我想洗牌这些数字,如果数字小于10,则在数组中为该点放置一个“Y”,如果大于或等于10,则放置一个“N”。最终结果应为随机定位的15 N和10 Y

我有下面的代码可以做到这一点,但我发现它真的很低效,我想知道是否有更好的方法来做到这一点

//Define Empty Array
test = new Array(rows);

for (var k = 0; k < rows; k++)
{
    test[k] = Array(cols);
}


var values = [];
var index = 0;
var maxVals = (rows * cols);

//If maxVals is equal to 25, then the values array will hold "1,2,3,4, ... 24,25"
while(values.push(index++)<maxVals);

//Shuffle all those values so they're no longer in order
var shuffledValues = _.shuffle(values);


var i = 0;
var smallerThan = 10;

for (var x = 0; x < rows; x++)
{
    for (var y = 0; y < cols; y++)
    {

        //Make all the numbers smaller than 10 a Y
        if (shuffledValues[i] < smallerThan)
        {
            test[x][y] = "Y";
        }
        else
        {
            test[x][y] = "N";
        }

        i++;
    }
}
//定义空数组
测试=新阵列(行);
对于(var k=0;kwhile(values.push(index++)由于需要迭代数组中的所有
n=rows×columns
元素来设置值,因此您的算法的最小时间复杂度已经达到
O(n)
。创建索引数组的循环是另一个
n
和shuffle方法(如果实现正确)也应该在
n
中洗牌,因此您的算法已经是
O(3n)=O(n)
。虽然您可以减少常数因子3,但随着行数和列数的增加,它不会产生太大的差异

如果您不需要确切的某个数字为“Y”或“N”,而只需要它们的平均比率,那么您可以这样做:

var ratio = 0.5; //use your required ratio here
for (var x = 0; x < rows; x++)
{
    for (var y = 0; y < cols; y++)
    {
        test[x][y] = Math.random() < ratio ? "Y" : "N";
    }
}
var ratio=0.5;//在此处使用所需的比率
对于(变量x=0;x
是否需要正好为10和15?是否总是<10表示“Y”?不总是,我在这里把10作为一个数字而不是一个变量,只是为了让它更容易理解,但它在实际代码中是一个变量。你为什么要洗牌,然后检查索引的值?你能创建一个所需的Y/N计数的数组,然后洗牌吗?用d创建数组的最佳方法是什么重新选择“Y”/“N”,然后将其洗牌,使其不再按任何顺序排列?这样会更有效吗?谢谢你的回答!我只是想知道,假设我确实需要一个精确的“Y”和“N”。使用你的方法,然后循环使用这些值,并将额外的“Y”转换为“N”和额外的“N”转换为“N”会更好吗直到我得到确切的期望结果为止?或者,对于这种情况,另一种方法会更好吗?你最好还是按照你已经做过的方式来做。你可以通过用适当数量的Y和N填充一个数组,然后洗牌来节省一点时间。它仍然需要循环3 times over rows*columns元素数,但您至少会在最后一个循环中消除if语句。请参见此处: