我正在尝试将我拥有的4张图片的顺序随机化。我正在为C#Windows Phone App做一个旗帜猜测游戏,它的工作非常好,但正确的答案总是标志4,所以如果有人对如何改变图像的顺序有任何建议。
答案 0 :(得分:0)
你可以使用Linq。假设你有一个“Flag”对象列表,这样的东西会做你想要的吗?
class Program
{
static Random Random = new Random();
static void Main(string[] args)
{
List<Flag> flags = new List<Flag>()
{
new Flag() {Name = "A"},
new Flag() {Name = "B"},
new Flag() {Name = "C"},
new Flag() {Name = "D"}
};
Console.WriteLine(String.Join(",", flags.Select(f => f.Name)));
IEnumerable<Flag> randomlyOrdered = flags.OrderBy(f => Random.Next());
List<Flag> newListInDifferentOrder = new List<Flag>(randomlyOrdered);
Console.WriteLine(String.Join(",", newListInDifferentOrder.Select(f=>f.Name)));
}
private class Flag
{
public String Name { get; set; }
}
}
答案 1 :(得分:0)
您可以实现这样的方法,从列表中随机选择任何类型的项目:
private System.Random random = new System.Random();
public T GetRandomItem<T>(IList<T> candidates)
{
int index = candidates.Count;
while (index >= candidates.Count)
index = (int)(random.NextDouble() * (double)candidates.Count);
return candidates[index];
}
然后你会把它用作你的旗帜,假设你有一个名为Flag的类,就像这样:
List<Flag> possibleFlags; // <-- You populated this somewhere in your app
Flag randomFlag = GetRandomItem<Flag>(possibleFlags);
请注意,System.Random是一个低质量的随机数生成器。如果需要,你可以插入更好的。在选择索引时还要注意while循环 - 这是为了处理从随机数生成器获取值1.0的非常罕见的情况,但仍然保持所有其他值的概率相等。
答案 2 :(得分:0)
使用shuffling algorithm。这是来自DotNetPerls的简洁C#实现:
using System;
class Program
{
/// <summary>
/// Used in Shuffle(T).
/// </summary>
static Random _random = new Random();
/// <summary>
/// Shuffle the array.
/// </summary>
/// <typeparam name="T">Array element type.</typeparam>
/// <param name="array">Array to shuffle.</param>
public static void Shuffle<T>(T[] array)
{
var random = _random;
for (int i = array.Length; i > 1; i--)
{
// Pick random element to swap.
int j = random.Next(i); // 0 <= j <= i-1
// Swap.
T tmp = array[j];
array[j] = array[i - 1];
array[i - 1] = tmp;
}
}
由于此代码是通用的,因此您绝对可以将其用于图像数组。