1

有没有办法在没有暴力破解的情况下在 2d 布尔数组 (bool[,]) 中选择一个随机位置,其值为负值?

4

3 回答 3

2

这是一种非暴力方法,但它涉及对整个表的初始扫描:

int[] negOffsets = new int[data.Length];
int dataOffset = 0, count = 0;
foreach(bool x in data)
{
    if(!x) negOffsets[count++] = dataOffset;
    dataOffset++;
}
if(count == 0) {
    // nothing to pick
} else {
    int index = negOffsets[rand.Next(0, count)];

    int x = index / data.GetLength(1),
        y = index % data.GetLength(0);
    // assertion: the following should be false
    bool b = data[x, y];
}

此外,您可能希望保留offsets并在迭代之间重新使用它。

于 2012-10-22T12:41:39.353 回答
1

希望你能从代码中得到想法。显然它需要一些调整,但是这个概念是使用 TestClass 作为数组的覆盖。不需要任何扫描,而且非常易于使用;)

 public class TestClass
    {
        public bool[,] BoolArray
        {
            get;
            private set;
        }
        private List<Tuple<int, int>> negativeValues;

        public TestClass(int x, int y)
        {
            this.negativeValues = new List<Tuple<int, int>>();
            this.BoolArray = new bool[x, y];
        }

        public Tuple<int, int> GetPosition()
        {
            if (this.negativeValues.Count > 0)
            {
                Random rand = new Random();
                return this.negativeValues[rand.Next(this.negativeValues.Count - 1)];
            }
            else
                return null;
        }



        public bool this[int x, int y]
        {
            get
            {
                return this.BoolArray[x, y];
            }

            set
            {
                if (!value)
                    negativeValues.Add(new Tuple<int, int>(x, y));

                this.BoolArray[x][y] = value;
            }
        }
    }
于 2012-10-22T12:46:11.637 回答
0

是的,完全有可能:

var random = new Random();
int xBound = 100;
int yBound = 100;
var values = new bool[xBound, yBound];

// Fill the values array
for (int y = 0; y < yBound; y++)
{
    for (int x = 0; x < xBound; x++)
    {
        values[x, y] = random.Next(0, 2) == 1;
    }
}

// Find the value at a random position that's false
bool foundFalse = false;
int probeX, probeY;

while (!foundFalse)
{
    probeX = random.Next(0, xBound);
    probeY = random.Next(0, yBound);

    if (values[probeX, probeY] == false)
    {
        // Do something with your probeX, probeY values perhaps
        foundFalse = true;
    }
}

但是,询问这是否有用可能是明智的。为什么要在多维数组中随机探测,直到找到某个值?是不是有一些潜在的问题可以用不同的方式解决,更重要,更有效?

请注意,例如,使用这种方法,while()循环很可能永远不会结束。

您可以尝试事先遍历数组,以定位存在 a 的 [x,y] 索引false并将这些坐标存储在单独的列表中,例如,Tuple<int,int>(或使用@MarcGravell 发布的更优雅的解决方案) .

然后您可以从该列表中选择一个随机项目,您将有一个随机[x,y]where values[x,y]will be false

于 2012-10-22T12:37:41.853 回答