Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/70: Рейтинг темы: голосов - 70, средняя оценка - 4.54
15 / 12 / 4
Регистрация: 03.02.2011
Сообщений: 96

Случайная сортировка

25.10.2011, 21:21. Показов 14333. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как в C# случайно отсортировать массив?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2011, 21:21
Ответы с готовыми решениями:

Случайная сортировка с использованием IComparer
Попытался реализовать "случайную" сортировку листа с помощью этого класса class Comparator : IComparer<String> { ...

Сортировка выбором, сортировка вставкой, сортировка заменой, сортировка обменом ("пузырьковая" сортировка)
Создать класс, содержащий массив и реализующий алгоритмы сортировки и бинарного поиска в этом массиве. Класс описать с помощью...

Случайная буква
Ребята, у меня имеется к примеру string dog = "Собака", string cat = "Кошка";. Можно ли сделать так, чтоб слово "Кошка" -...

18
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
25.10.2011, 21:59
случайно - это ещё как?
1) перемешать
2) быстрая сортировка? qsort(),
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.10.2011, 22:18
Случайно - это типа "упс, остортировал..."?

Если серьезно, то вот вам хороший, годный метод:
C#
1
2
3
4
5
6
7
8
9
10
static void Shuffle<T>(T[] a)
{
    Random rand = new Random();
    for (int i = a.Length - 1; i > 0; i--) {
        int j = rand.Next(0, i + 1);
        T tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
}
3
16 / 16 / 5
Регистрация: 11.10.2011
Сообщений: 37
25.10.2011, 22:24
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void Main(string[] args)
        {
            int[] array ={ 2, 5, 3, 4, 5 };
            Random rnd = new Random();
            
           for (int i = 0; i < array.Length; i++)
            {
               int j = rnd.Next(array.Length);
               int var = array[i];
               array[i] = array[j];
               array[j] = var;
              
            }
           for (int i = 0; i < array.Length; i++)
           {
               Console.WriteLine(array[i]);
           }
            Console.ReadKey();
        }
0
Level 2
 Аватар для FakiR
401 / 275 / 48
Регистрация: 22.11.2010
Сообщений: 785
Записей в блоге: 1
25.10.2011, 22:37
C#
1
static void Shuffle<T>(T[] a) { ... }
Полезная полезный пример, спасибо. Не знал что методы можно так объявлять.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.10.2011, 22:40
Цитата Сообщение от Antigo Посмотреть сообщение
int j = rnd.Next(array.Length);
Ошибка новичка.
На собеседованиях при подобном вопросе сыпятся именно на этой строчке.
0
Level 2
 Аватар для FakiR
401 / 275 / 48
Регистрация: 22.11.2010
Сообщений: 785
Записей в блоге: 1
25.10.2011, 22:47
kolorotur, а что не так в той строке?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.10.2011, 22:54
FakiR, при таком подходе растасовка будет распределена не равномерно по массиву.

Поясню.
В каждой итерации генерируется случайное число в интервале от 0 до n, что влечет за собой потенциально многократное передвижение одного и того же элемента.
Доводя пример до абсурда (хотя статистически это вполне возможно), можно предположить, что на всех n итерациях сгенерируется одно и то же число, в результате одна пара будет двигаться взад-назад, а остальной массив останется нетронутым.
Передвинув один элемент массива, больше его трогать не надо - пусть живет на новом месте.
Заметьте, при этом из пары свопнутых элементов рассматривается только один. Второй элемент пары можно еще разок передвинуть.
2
16 / 16 / 5
Регистрация: 11.10.2011
Сообщений: 37
25.10.2011, 23:11
код отлично работает и ошибок в нем нет, а вероятность "Доводя пример до абсурда" ничтожно мала.
http://rosettacode.org/wiki/Knuth_shuffle#C.23

Цитата Сообщение от FakiR Посмотреть сообщение
C#
1
static void Shuffle<T>(T[] a) { ... }
Полезная полезный пример, спасибо. Не знал что методы можно так объявлять.
это обобщенный метод
0
Level 2
 Аватар для FakiR
401 / 275 / 48
Регистрация: 22.11.2010
Сообщений: 785
Записей в блоге: 1
25.10.2011, 23:15
Ну на самом деле оба кода одинаково отлично мешают элементы.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.10.2011, 23:22
Цитата Сообщение от Antigo Посмотреть сообщение
код отлично работает и ошибок в нем нет, а вероятность "Доводя пример до абсурда" ничтожно мала.
http://rosettacode.org/wiki/Knuth_shuffle#C.23
До абсурда пример доводят для лучшего понимания проблемы.
Вероятность же повторной выборки при таком подходе далеко не так мала как кажется: сгенерируйте 10 случайных чисел в диапазоне от 1 до 10. С большой вероятностью у вас будет минимум два повтора. Это значит минимум два элемента останутся на своих местах.
Что касается алгоритма Кнута, то в книге "Искусство программирования" за его авторством (кстати, горячо рекомендую к прочтению), приводится именно алгоритм, учитывающий этот момент. Так что пример на розетте можно считать ошибочным.

Не по теме:

Как тут не похвастаться: у моего бывшего профессора в университете наставником был Кнут. Правило шести рукопожатий :D

0
0 / 0 / 0
Регистрация: 21.07.2018
Сообщений: 3
07.07.2020, 21:33
Добавлено через 1 час 40 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Program
    {
        static void Main()
        {
            int[] mas1 = { 1, 2, 3, 4, 5 };
            int[] mas2 = new int[mas1.Length];
 
            for (int i = 0; i < mas1.Length; i++)
            {
                int m, res;
                Random r = new Random();
 
                do
                {
                    res = r.Next(mas1.Length);
                    m = mas1[res];
                    mas2[i] = m;
                    mas1[res] = 0;
                }
                while (mas2[i] == 0);
            }
 
            for (int i = 0; i < mas1.Length; i++)
                mas1[i] = mas2[i];
 
            foreach(int f in mas1)
                Console.WriteLine(f);
 
            Console.ReadKey();
        }
    }
Добавлено через 6 минут
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.07.2020, 21:37
Saents, у вас постоянно одно и то же "случайное" число генерируется.
0
628 / 392 / 135
Регистрация: 06.03.2017
Сообщений: 1,469
07.07.2020, 21:43
kolorotur, а через Linq сортировка достаточно случайная получается?
что-то вроде такого
C#
1
ar.OrderBy(x => r.Next());
0
0 / 0 / 0
Регистрация: 21.07.2018
Сообщений: 3
07.07.2020, 21:45
Добавлено через 1 минуту
1
Цитата Сообщение от kolorotur Посмотреть сообщение
Saents, у вас постоянно одно и то же "случайное" число генерируется.
У меня всегда разный результат. Попробуйте:

C#
1
Random r = new Random(DateTime.Now.Millisecond);
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.07.2020, 22:08
Цитата Сообщение от Pilarentes Посмотреть сообщение
а через Linq сортировка достаточно случайная получается?
Вполне.

Цитата Сообщение от Saents Посмотреть сообщение
У меня всегда разный результат.
C#
1
2
res = r.Next(mas1.Length);
Console.WriteLine(res);
0
0 / 0 / 0
Регистрация: 21.07.2018
Сообщений: 3
07.07.2020, 22:19
Цитата Сообщение от kolorotur Посмотреть сообщение
C#
1
2
res = r.Next(mas1.Length);
Console.WriteLine(res);
у меня: 1, 2, 0, 4 и т.д.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
07.07.2020, 23:22
Saents, а что делать если в исходном массиве есть 0?

Добавлено через 5 минут
Цитата Сообщение от Saents Посмотреть сообщение
У меня всегда разный результат. Попробуйте:
разный то он разный, только он долбит один и тот же элемент по кругу 10-16 миллисекунд, пока не перейдет к следующему

Добавлено через 9 минут
ну и как результат это ооооочень медленно. на 10 000 000 элементов я чай успел сделать, а потом надоело ждать. Для сравнения медленный линк справился бы за 4 секунды.
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
08.07.2020, 00:49
Что если так:
C#
1
2
3
    var rnd = new Random();
    var mas = Enumerable.Range(0, 10).Select(_ => rnd.Next(0, 100)).OrderBy(x => Guid.NewGuid()).ToArray();
    Console.WriteLine(string.Join(" ", mas));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.07.2020, 00:49
Помогаю со студенческими работами здесь

Случайная форма
Ребята, как запустить случайную форму? Например, есть три формы. На главной пользователь нажимает кнопку, и запускается одна из двух других...

Случайная цитата с баша.
Подскажите пожалуйста, как брать случайную цитата отсюда http://bash.org.ru/forweb Вот нашел, как люди делали на бейсике...

Случайная строка из файла
Доброго времени суток, как можно получить случайную строку из текстового файла?

Случайная форма
Как сделать чтобы при нажатии кнопки открывалась случайная форма. Например есть 10 форм. 1 основная и 9 вторичных. На основной форме есть...

случайная строка
Надо сделать так, чтобы строка состояла из случаынйх символов. Я её пытаюсь посимвольно заполнить, но так как в с++ сделать не получается ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru