Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从一个数组中随机选取元素以移动到另一个数组_C#_Arrays_Random - Fatal编程技术网

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

C#从一个数组中随机选取元素以移动到另一个数组,c#,arrays,random,C#,Arrays,Random,我还在学C#,所以请耐心听我解释。基本上我想做的就是发一副牌。所以arrayA(在我的例子中是ArrayGameFusions)有52个元素,我想将10张卡移动到arrayB(arrayBlessings),同时将它们从arrayA中移除。这是我到目前为止得到的 for (int i = 0; i <= arrayGameBlessings.Length; i++) { int bless = rnd.Next(arrayBlessings.Length); arrayGa

我还在学C#,所以请耐心听我解释。基本上我想做的就是发一副牌。所以arrayA(在我的例子中是ArrayGameFusions)有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(int i=0;i w!=arrayBlessings[bless]).ToArray();
}

但据我所知,这没什么用。。。实现这一目标的最佳方式是什么?最好是一个超级简单的一,两行方法,易于理解和修改。谢谢

卡交易通常是这样进行的:

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张牌
  • 洗牌是这样做的。将0到51的整数放入数组。然后用Fisher Yates shuffle来洗牌。也许是这样的:

    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张牌


    你不需要从洗牌牌组中移除任何元素。你只需要记住到目前为止你花了多少钱。即使这样,如果你以后要再进行一次洗牌而不进行新的洗牌,你也只需要这样做。

    你的方法本身并没有错,唯一的细节是,的
    应该使用
    //我假设你有一个卡片类,但这可以是任何东西,例如整数
    作废卡片(列表来源、列表目的地、整数卡片)
    {
    var rnd=新随机数();
    for(int i=0;i0;i++)
    {
    //要从源中删除的随机卡位置
    var idxSrc=rnd.Next(source.Count);
    //在目的地中插入新卡的随机位置
    变量idxDst=rnd.Next(目的地计数);
    dest.Add(idxDst,source[idxSrc]);
    source.RemoveAt(idxSrc);
    }
    }
    
    列表
    数组
    更适合这种情况。到目前为止,您尝试过什么吗?更具体地说,
    系统.Collections.Generic.List
    将是正确的选择。因此,它是一个回答特定编程问题的网站,而不是为您编写代码的网站。向我们展示你的尝试。洗牌不需要列表。一个阵法就可以了。那么在洗牌之后,你会如何准确地将这N张牌从一个阵法转移到另一个阵法呢?随机化并不是真正的问题,而是从一个数组转移到另一个数组。同样,如果这是一个愚蠢的基本问题,很抱歉,就像我说的,我是C#的新手,只需将前N个元素复制到一个新数组中。而洗牌将是一个问题。做错事很容易。
    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);
    }
    
    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);
    }
    
    //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);
      }
    }