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

时间:2013-11-24 09:06:04

标签: c# arrays random

我还在学习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();
}

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

3 个答案:

答案 0 :(得分:2)

您的方法本身没有错,唯一的细节是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);
}

mentioned作为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 :(得分:1)

卡片交易通常是这样完成的:

  1. 进行洗牌。
  2. 从洗牌阵列中挑选前N张牌。
  3. 洗牌是这样的。将整数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卡。

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

答案 2 :(得分:0)

//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);
  }
}