![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
lavrnn |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 23.2.2009 Репутация: нет Всего: нет |
Решил изучать net ... и использовать.
Создал одномерный массив из 36 элементов. Могу ли я реализовать перемешивание массива стандартными методами, либо нужно писать отдельный функционал? |
|||
|
||||
mihryak |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
функции готовой такой нет, здесь вам не пхп
![]() зато с linq это можно сделать в полторы строчки:
Это сообщение отредактировал(а) mihryak - 17.6.2009, 00:29 |
|||
|
||||
dazy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 15.9.2006 Репутация: 1 Всего: 8 |
А random может быть любым? Не только от 0 до 6?
Если можно пару камментов, как это работает, что-то не совсем понятен принцип. |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
При сортировке для каждого элемента будет использован rand.Next() в качестве приоритета. А так как rand.Next() генерирует псевдослучайные числа, на выходе получим перемешивание массива. Конечно, использовать сортировку для перемешивания - не самый оптимальный подход... но для указанных lavrnn 36 элементов - самое то. Это сообщение отредактировал(а) Idsa - 17.6.2009, 07:26 |
|||
|
||||
dazy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 15.9.2006 Репутация: 1 Всего: 8 |
Мне не совсем понятно, как используется чистый рандом, без приведения к формату массива.
Я самого механизма не понимаю, т.е. если на одной итерации random будет равен 3, а на другой 100, а элементов массива всего 36, это не помешает перемешиванию? Не будет выхода за границы? Т.е. как именно вот эта штука работает - sourceArray.OrderBy(i => random.Next()).ToArray(); И почему random может быть любым числом? Правильно я понял, что точно таким же образом можно можно перемешать любой массив, хоть со строками, хоть с объектами? Тогда уточним вопрос ТС, а как правильно перемешать массив в общем случае, а не только всего из 36 элементов? |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 5 Всего: 36 |
dazy,
как правильно перемешать массив в общем случае например так, как это делается в std::random_shuffle |
|||
|
||||
Idsa |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Для каждого элемента rand.Next() высчитывается один раз, поэтому не помешает.
Да, конечно. Это нечто вроде упрощенного IComparer.
Как угодно ![]() Первое, что пришло в голову: 1. Длина массива n. Берем переменную k = n / 2 2. Цикл от 0 до k - 1. В ходе каждой итерации переставляем rand.Next() и rand.Next() элементы (где rand ограничен длиной массива). 3. Если длина массива < 5 - реализуем ручную перестановку. И как же? ![]() |
||||||
|
|||||||
mihryak |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
Работает так - каждому элементу массива сопоставляется произвольное случайное число, т.е. вместо элемента появляется пара "элемент-случайное число", а после они сортируются по этому произвольному числу. А какое именно оно будет, из какого диапазона - совершенно не важно, даже интуитивно кажется, что чем хаотичней, тем лучше, так что Random параметризовать не обязательно. Работать будет с любым массивом, независимо от типа элементов, везде суть будет та же - абстрактному элементу сопоставляется случайное целочисленное значение. В общем случае можно написать цикл, пробегающий по всему массиву, на каждой итерации получать рандомный индекс из диапазона [0, n), менять местами текущий элемент итерации на элемент с полученным индексом. Работать будет надёжно, про кол-во элементов и потребляемую память можно будет не думать. Но если позволяет задача (не слишком большое количество элементов и эпизодическая потребность в их перемешивании), я бы воспользовался способом из моего первого комментария. Добавлено @ 09:09 мне кажется, что этот способ будет не очень хорошо перемешивать, особенно при небольших размеров массива - многие имеют шанс остаться на своём месте Это сообщение отредактировал(а) mihryak - 17.6.2009, 09:14 |
|||
|
||||
dazy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 15.9.2006 Репутация: 1 Всего: 8 |
Вроде дошло, спасибо за развернутый ответ! |
|||
|
||||
lavrnn |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 23.2.2009 Репутация: нет Всего: нет |
mihryak
Очень вам признателен! Благодарю! Не уверен, что это самый оптимальный вариант, но пока - в качестве заглушки, очень помогло! |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
lavrnn, а почему бы сразу не использовать списки?
|
|||
|
||||
mihryak |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
а чем они помогут в решении задачи?
вот решение с обменом занчениями со случайным индексом, не уверен, что оно оптимально, но по меньшей мере имеет сложность O(N), в отличие от linq'шного OrderBy
|
||||||
|
|||||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |