[英]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);
}
卡片交易通常如下所示:
洗牌是这样的。 将整数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.