Я пытаюсь рандомизировать порядок из 4 изображений, которые у меня есть. Я делаю игру с гангом флага для C# Windows Phone App, ее работа очень хорошая, но правильным ответом всегда является флаг 4, поэтому, если у кого-то есть какие-то советы о том, как я могу изменить порядок изображений.Случайный порядок ящиков изображений
ответ
Вы можете использовать Linq. Скажем, у вас есть список объектов «Флаг», что-то вроде этого сделает то, что вы хотите?
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; }
}
}
Вы можете реализовать метод, как это случайным образом выбрать любой тип элемента из списка:
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];
}
Тогда вы будете использовать его для ваших флагов, если у вас есть класс с именем флага, как это:
List<Flag> possibleFlags; // <-- You populated this somewhere in your app
Flag randomFlag = GetRandomItem<Flag>(possibleFlags);
Обратите внимание, что System.Random - это генератор случайных чисел низкого качества. Вы можете подключить их лучше, если они вам понадобятся. Также обратите внимание на цикл while при выборе индекса - это обработка очень редкого случая получения значения 1.0 от генератора случайных чисел, но при этом сохраняя вероятность равной для всех других значений.
Использовать shuffling algorithm. Вот хороший и простой C# реализация от DotNetPerls:
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;
}
}
Поскольку этот код является универсальным, вы определенно можете использовать его для массива изображений.
Как заказ определен в настоящее время? Я не вижу кода. – FrankPl
<Изображение x: Name = "Flag1" Grid.Row = "0" Grid.Column = "0" HorizontalAlignment = "Center" VerticalAlignment = "Top" Tap = "Flag1_Tap" /> <Изображение x: Name = "Flag2 "Grid.Row =" 1 "Grid.Column =" 0 "HorizontalAlignment =" Center "VerticalAlignment =" Center "Tap =" Flag2_Tap "/> <Изображение x: Name =" Flag3 "Grid.Row =" 0 "Сетка .Column = "1" HorizontalAlignment = "Center" VerticalAlignment = "Top" Margin = "7,1,3,0" Tap = "Flag3_Tap" /> <Изображение x: Name = "Flag4" Grid.Row = "1 «Grid.Column =« 1 »HorizontalAlignment =« Center »VerticalAlignment =« Center »Margin =« 1,1,0,0 »Tap =« Flag4_Tap »/> – user3010392
@ user3010392 - вам нужен другой подход. Не жуйте код макета «Флаги» в XAML. Составьте список объектов «флаг», а затем «привязать» к списку (или подобному) в XAML. Затем вы можете использовать любой из методов, описанных в ответах ниже, чтобы заказать свой список. Обратите внимание: если вы используете список, который не является коллекцией Observable, вам необходимо сначала его заказать. –