我还在学习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();
}
但据我所知,这并没有做任何事情......实现这样的目标最好的方法是什么?优选地,易于理解和修改的超简单,双线方法。谢谢!
答案 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)
卡片交易通常是这样完成的:
洗牌是这样的。将整数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);
}
}