通过排除某些数组的元素值来获取随机数组元素索引

时间:2018-02-05 23:51:16

标签: c# arrays random

我是以下所有错误值的数组

bool[] deniedMoves = new bool[64];

想到一个有x个可能移动的游戏板。在播放了一个动作后,它被记录下来,在下一个游戏中一些动作变得不可能。像Go这样的游戏适合这种描述,因为你不能在已经玩过的交叉点上玩。

我想要" AI"从可能的移动列表中随机移动。第一步是好的:

Random randMove1 = new Random();
int selectedMove1 = randMove1.Next(1, deniedMoves.Length);

然后该移动将我的数组中的一些值设置为true。

例如:

void Reset()
{
    if (mainBoard[0, 0] == 1)
        deniedMoves[0] = true;
    deniedMoves[3] = true;
    deniedMoves[5] = true;
}

下一次随机移动" AI"将玩不能从所有64种可能性中选择,所以我不希望它随机化为5例如。

我尝试过类似的东西,但RandomElement并不属于......

IEnumerable<bool> queryMoves = deniedMoves.Where(deniedMove => deniedMove !=             
true).RandomElement();

我的第一个问题,我非常抱歉糟糕的代码和一般的编码无知。我试过了。

3 个答案:

答案 0 :(得分:1)

你所做的就是我所谓的“彩票问题”:你有很多选择。但是,当选择每个选项时,它将从可能的选项列表中删除。就像从一组彩票球中抽取数字一样。

您应该将所有选项存储在List<bool>中,并在绘制/使用时删除元素。示例代码主要在我脑海中完成:

int[] input = new int[20]();

//Fill array
for(int i = 0; i < numbers.lenght; i++)
  input[i] = i;

//initialise the real work variables
List<int> Drawables = new List<int>(input);
List<int> DrawnNumbers = new List<int>();
Random rng = new Random();

while(Drawables.Count > 0){
  int temp = Random.NextInt(Drawables.Count);
  DrawnNumbers = Drawables[i];
  Drawables.Remove(temp);
}

答案 1 :(得分:0)

我会使用一些LINQ - 这可能不是最有效的答案......

bool[] deniedMoves = new bool[64];

System.Random randMove1 = new System.Random();

首先,在允许的移动中选择随机移动:

int allowedMove = randMove1.Next(0, deniedMoves.Count(d => !d)-1);

然后得到实际的移动指数:

int selectedMove = deniedMoves.Select((d, i) => new { d, i })
                              .Where(di => !di.d)
                              .Skip(allowedMove)
                              .First().i;

我将移动更改为0到63,因为它更好地匹配C#数组。

答案 2 :(得分:0)

我不确定这是否是你所追求的,它与NetMages&#39;非常相似。回答,但你可以做的一件事是编写一个方法,返回数组中包含function wrongAnswer(name) { document.getElementsByName(name)[0].style.backgroundColor = "red"; } 值的所有索引:

false

然后,要从数组中选择值为private static IEnumerable<int> GetIndexesOfFalseItems(IEnumerable<bool> allItems) { return allItems .Select((value, index) => new { value, index }) .Where(item => item.value == false) .Select(item => item.index); } 的随机项,您可以这样做:

false