Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/82: Рейтинг темы: голосов - 82, средняя оценка - 4.93
4 / 4 / 2
Регистрация: 14.07.2011
Сообщений: 19
1

Перемешать случайным образом массив целых чисел

26.11.2013, 00:59. Показов 16068. Ответов 16
Метки нет (Все метки)

Здравствуйте!
Подскажите, пожалуйста, как в C# перемешать случайным образом массив целых чисел.
Аналог random.shuffle(lst) в Python.
Спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2013, 00:59
Ответы с готовыми решениями:

Массив целых чисел из 10 элементов заполнить случайным образом. Упорядочить массив по убыванию. Найти сумму квадратов
Массив целых чисел из 10 элементов заполнить случайным образом. Упорядочить массив по убыванию....

Дан массив целых чисел (n=25), заполненный случайным образом числами из промежутка [-50,50]
Помогите пожалуйста написать программу на C#. Спасибо заранее) Дан массив целых чисел (n=25),...

Массив 10х10 заполнить 0 и1 случайным образом но в соотношении 3:1
Добрый вечер! подскажите, пожалуйста, как заполнить матрицу 10х10 0 и1 случайным образом но в...

Заполнить массив случайным образом: вещественными значениями
Помогите с задачкой (2) 2.Заполнить массив из пятнадцати элементов случайным образом:...

16
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
26.11.2013, 03:18 2
В шарпе тоже есть Random.Next
0
4 / 4 / 2
Регистрация: 14.07.2011
Сообщений: 19
26.11.2013, 11:22  [ТС] 3
Это я нашел. А встроенной функции перемешивания нету?
Вот моя реализация:

C#
1
2
3
4
5
6
7
8
9
10
11
12
        public static void Shuffle(this int[] array)
        {
            if (array.Length < 1) return;
            var random = new Random();
            for (var i = 0; i < array.Length; i++)
            {
                var key = array[i];
                var rnd = random.Next(i, array.Length);
                array[i] = array[rnd];
                array[rnd] = key;
            }
        }
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
26.11.2013, 11:32 4
встроенной функции перемешивания нет
0
367 / 339 / 108
Регистрация: 12.02.2013
Сообщений: 653
26.11.2013, 11:38 5
Цитата Сообщение от NJohn Посмотреть сообщение
как в C# перемешать случайным образом массив целых чисел.
C#
1
OrderBy(x => rand.Next())
3
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
26.11.2013, 11:42 6
Цитата Сообщение от Diman777 Посмотреть сообщение
OrderBy(x => rand.Next())
Красиво!
0
4 / 4 / 2
Регистрация: 14.07.2011
Сообщений: 19
26.11.2013, 11:54  [ТС] 7
Diman777, спасибо!
0
Эксперт .NET
15564 / 11812 / 3099
Регистрация: 17.09.2011
Сообщений: 19,727
26.11.2013, 12:13 8
O(n) с гарантированной сменой позиции каждого элемента:
C#
1
2
3
4
5
6
7
8
var r = new Random();
for (int i = arr.Length - 1; i > 0; i--)
{
   int j = r.Next(i);
   var t = arr[i];
   arr[i] = arr[j];
   arr[j] = t;
}
2
4 / 4 / 2
Регистрация: 14.07.2011
Сообщений: 19
26.11.2013, 15:52  [ТС] 9
kolorotur, спасибо!
Но у меня по-моему тоже самое
0
Эксперт .NET
15564 / 11812 / 3099
Регистрация: 17.09.2011
Сообщений: 19,727
26.11.2013, 17:23 10
Цитата Сообщение от NJohn Посмотреть сообщение
Но у меня по-моему тоже самое
Ага, оно
Можно, конечно, придраться к тому, что последний элемент сам с собой свопнется, но это чепуха.
0
4 / 4 / 2
Регистрация: 14.07.2011
Сообщений: 19
26.11.2013, 20:40  [ТС] 11
kolorotur, спасибо за замечание!
Действительно, так оно и есть.
Поставил условие i < array.Length-1
0
foo();
885 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
09.05.2015, 23:34 12
Цитата Сообщение от kolorotur Посмотреть сообщение
с гарантированной сменой позиции каждого элемента
на самом деле, это не всегда хорошо. теряется солидная доля перестановок, я насчитал (n - 1)! перестановок вместо n! . для малых n - это критично, например 4! = 24 вместо 5! = 120 для n = 5. благо, исправить несложно - заменив 4-ю строку
C#
1
int j = r.Next(i + 1);
0
Эксперт .NET
15564 / 11812 / 3099
Регистрация: 17.09.2011
Сообщений: 19,727
10.05.2015, 00:55 13
Цитата Сообщение от rattrapper Посмотреть сообщение
на самом деле, это не всегда хорошо.
Почему же не хорошо, если стоит задача — перемешать?

Цитата Сообщение от rattrapper Посмотреть сообщение
теряется солидная доля перестановок, я насчитал (n - 1)! перестановок вместо n!
Тут важно понимать: в чем цель алгоритма.
Если цель в генерации как можно большего количества возможных комбинаций, то да — здесь не поспоришь.
Если же цель состоит в перемешивании массива и надо допустить возможность того, что какие-то из элементов могут остаться на своих местах, то нужно определить предел этому количеству. 1? 2? n/2? n? Последний вариант — это отсутствие перемешивания, т.к. конечная пермутация является идентичностью.
Потому если цель состоит в перемешивании, то лучше смириться с потерей некоторого количества пермутаций в обмен на гарантию того, что в итоге не получим идентичность.
Ну или значительно усложнять алгоритм для учета количества элементов, которым можно оставаться на местах.

Вы когда колоду карт тасуете, вам что важнее: какое количество уникальных раскладов вы можете теоретически получить или то, что у вас колода после перетасовки не будет такой же, как до?

Цитата Сообщение от rattrapper Посмотреть сообщение
для малых n - это критично
Для малых n как раз более критична гарантия перестановки, т.к. если у вас множество { 1, 2 }, то при выбранном вами подходе мы либо имеем перестановку, либо идентичность: 50/50.
Если нужно перемешивание, то меня расклад фифти-фифти ну никак не устраивает

Цитата Сообщение от rattrapper Посмотреть сообщение
благо, исправить несложно - заменив 4-ю строку
Тем самым сведя на нет весь замысел — гарантию того, что массив перемешается
0
foo();
885 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
10.05.2015, 01:40 14
kolorotur, ну тут спорить не о чем, все зависит о поставления задачи. Вы ведь не будете не будете заведомо исключать комбинацию( 1 2 3 4) из лотерейных билетов, не говоря уже про (3 2 4 1).
Кстати, питоновский random.shuffle, упомянутый в шапке, мешает рандомно без каких-либо ограничений.
0
Эксперт .NET
15564 / 11812 / 3099
Регистрация: 17.09.2011
Сообщений: 19,727
10.05.2015, 01:58 15
Цитата Сообщение от rattrapper Посмотреть сообщение
Вы ведь не будете не будете заведомо исключать комбинацию( 1 2 3 4) из лотерейных билетов, не говоря уже про (3 2 4 1).
Так я о том же: есть перемешивание — это получение одной пермутации из другой, а есть генерирование случайной/уникальной пермутации. Они хоть и похожи, но по сути разные вещи и выполняют разные задачи.

Цитата Сообщение от rattrapper Посмотреть сообщение
Кстати, питоновский random.shuffle, упомянутый в шапке, мешает рандомно без каких-либо ограничений.
Плохой значит этот shuffle.
Но хоть какой-то, конечно, лучше, чем никакого.
0
Warrior
499 / 426 / 177
Регистрация: 23.11.2014
Сообщений: 932
10.05.2015, 02:02 16
Чем перемешивание отличается от случайной перестановки?
0
Эксперт .NET
15564 / 11812 / 3099
Регистрация: 17.09.2011
Сообщений: 19,727
10.05.2015, 02:34 17
Цитата Сообщение от _exp10der_ Посмотреть сообщение
Чем перемешивание отличается от случайной перестановки?
Тем, что идентичность перестановки является случайной перестановкой, но не является перемешиванием.
Очевидно же.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2015, 02:34

Шифрование. Сгенерировать случайным образом последовательность шестнадцатеричных чисел
Скажем имеется набор шестнадцатеричных чисел (&quot;1234567890ABCDEF&quot;). Как сгенерировать случайную...

Дан двумерный целочисленый массив, заполненный случайным образом
Дан двумерный целочисленый массив, заполненный случайным образом. Определить максимальный элемент...

Заполните массив случайным образом нулями согласно условия
Здравствуйте, нужно заполните массив случайным образом нулями, единицами и двойками так, чтобы...

Создать класс для формирования случайным образом чисел из 5 цифр
Создать класс для формирования случайным образом чисел из 5 цифр. Количество формируемых чисел...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru