繁体   English   中英

C#从一个数组中随机选取元素以移动到另一个数组

[英]C# randomly pick elements from one array to move to another

我还在学习C#,所以当我试图解释时,请耐心等待。 基本上我正在尝试做的是处理一副纸牌。 所以arrayA(在我的例子中是arrayGameBlessings)有52个元素,我想将10张卡移动到arrayB(arrayBlessings),同时也将它们从arrayA中删除。 这是我到目前为止所得到的

for (int i = 0; i <= arrayGameBlessings.Length; i++)
{
    int bless = rnd.Next(arrayBlessings.Length);
    arrayGameBlessings[i] = arrayBlessings[bless];
    arrayBlessings = arrayBlessings.Where(w => w != arrayBlessings[bless]).ToArray();
}

但就我所知,这没有做任何事情......实现这样的目标最好的方法是什么? 优选地,易于理解和修改的超简单,双线方法。 谢谢!

你的方法本身没有错,唯一的细节是for应该使用<而不是<= ,即:

void Main()
{
    var arrayBlessings = new int[]{1, 2, 3, 4, 5, 6};
    var arrayGameBlessings = new int[5];
    var rnd = new Random();
    for (int i = 0; i < arrayGameBlessings.Length; i++)
    {
        int bless = rnd.Next(arrayBlessings.Length);
        arrayGameBlessings[i] = arrayBlessings[bless];
        arrayBlessings = arrayBlessings.Where(w => w != arrayBlessings[bless]).ToArray();
    }
    Console.WriteLine(arrayBlessings);
    Console.WriteLine(arrayGameBlessings);
}

注意:在LinqPad上测试的代码。


话虽如此,你的方法非常有用。 每次调用ToArray都会创建一个新的数组,这个数组太多了。 相反,您可能想尝试List<T>

void Main()
{
    const int amount_to_deal = 5;
    var arrayBlessings = new List<int>{1, 2, 3, 4, 5, 6};
    var arrayGameBlessings = new List<int>();
    var rnd = new Random();
    for (int i = 0; i < amount_to_deal; i++)
    {
        int bless = rnd.Next(arrayBlessings.Count);
        arrayGameBlessings.Add(arrayBlessings[bless]);
        arrayBlessings.RemoveAt(bless);
    }
    Console.WriteLine(arrayBlessings);
    Console.WriteLine(arrayGameBlessings);
}

正如David Heffernan提到的,数组足以进行洗牌,例如以下代码将对数组进行洗牌:

void Main()
{
    var array = new int[]{1, 2, 3, 4, 5, 6};
    var rnd = new Random();
    for (int i = 0; i < array.Length - 1; i++)
    {
        int j = i + rnd.Next(array.Length - i);
        var tmp = array[j];
        array[j] = array[i];
        array[i] = tmp;
    }
    Console.WriteLine(array);
}

卡片交易通常如下所示:

  1. 进行洗牌。
  2. 从洗牌阵列中挑选前N张牌。

洗牌是这样的。 将整数0到51放入数组中。 然后用他们洗牌,例如费舍尔 - 耶茨洗牌。 也许是这样的:

int[] shuffle()
{
    int[] cards = Enumerable.Range(0, 52).ToArray();
    for (int i = cards.Length; i > 1; i--)
    {
        int j = random.Next(i);
        int temp = cards[j];
        cards[j] = cards[i-1];
        cards[i-1] = temp;
    }
    return cards;
}

int[] deal(int N)
{
    int[] result = new int[N];
    Array.Copy(shuffle(), 0, result, N);
    return result;
}

如果你想要更冒险,你可以调整洗牌只挑选N卡。

您不需要从洗牌的牌组中删除任何元素。 你只需要记住你到目前为止有多少人。 即便如此,如果你以后不再采取新的洗牌方式,你只需要这样做。

//I assume you have a Card class, but this can be anything, integers, for example 
void MoveRandomCards(List<Card> source, List<Card> dest, int cards)
{
  var rnd = new Random();
  for(int i = 0;i<cards && source.Count>0;i++)
  {
    // random card position to remove from source
    var idxSrc = rnd.Next(source.Count);
    // random position in destination to insert new card
    var idxDst = rnd.Next(dest.Count);
    dest.Add(idxDst, source[idxSrc]);
    source.RemoveAt(idxSrc);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM