C#从一个数组中随机选取元素以移动到另一个数组
我还在学C#,所以请耐心听我解释。基本上我想做的就是发一副牌。所以arrayA(在我的例子中是ArrayGameFusions)有52个元素,我想将10张卡移动到arrayB(arrayBlessings),同时将它们从arrayA中移除。这是我到目前为止得到的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
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;
}
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);
}
}