Первая часть вашего вопроса - перетасовка массива. Хорошим алгоритмом является Fisher-Yates shuffle.
Следующая часть о сравнении результата с оригиналом несколько более смутная. Я предполагаю, что вы хотите создать случайную перетасовку, которая гарантирует, что все элементы перетасовываются в новую позицию. Например.
- [0, 1, 2] => [1, 2, 0] в порядке, но
- [0, 1, 2] => [2, 1, 0] не в порядке, потому что 1 остается вместо
Я создал несколько расширений для этого (заметим, что это общее решение с элементом типа T
):
static class EnumerableExtensions {
static Random random = new Random();
public static IEnumerable<T> Randomize<T>(this IEnumerable<T> source) {
var list = source.ToList();
for (var k = 0; k < list.Count; k += 1) {
var j = random.Next(k, list.Count);
Swap(list, k, j);
}
return list;
}
public static IEnumerable<T> RandomizeUniquely<T>(this IEnumerable<T> source) {
while (true) {
var randomized = source.Randomize();
var isNotUnique = source
.Zip(randomized, (a, b) => Equals(a, b))
.Any(equal => equal);
if (!isNotUnique)
return randomized;
}
}
static void Swap<T>(IList<T> list, Int32 i, Int32 j) {
var temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
метод Randomize
реализует перетасовать Fisher-Yates. RandomizeUniquely
использует этот метод и пытается создать перетасовку, которая удовлетворяет описанному выше условию. Метод просто пытается до тех пор, пока не будет найдено удовлетворительное перемещение. Обратите внимание, что этот алгоритм не может завершиться. Например. если источник имеет только один элемент, то не может быть найдена уникальная тасовка. Кроме того, если источник содержит дубликаты, решение может не существовать.
Чтобы использовать метод просто назвать это так:
var randomized = Enumerable.Range(1, 7).RandomizeUniquely();
Код может быть улучшена путем проверки параметров и решить, как справиться с этой проблемой без прекращения описанной выше.
Хотя я согласен это не будет ужасно хорошо сформулированное или проработанный вопрос, я думаю, что его немного шероховатой downvote совершенно нового пользователя по крайней мере без объяснения о том, как улучшить их ответ –
Создайте случайный индекс, используя 'Random' like:' Random rand = new Random(); int randomIndex = rand.Next (0, arrayInt.Length); ', позже проверьте свой другой массив/список, чтобы увидеть, существует ли элемент против этого индекса из исходного массива. – Habib
У SO есть переводчики? Иногда кажется, что было бы лучше, если бы можно было спросить на его родном языке и перевести его профессиональным переводчиком (который в этом случае также знаком с контекстом - C# или общим программированием). – SimpleVar