Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
4 / 4 / 3
Регистрация: 21.06.2013
Сообщений: 23

Метод перемешивания (перетасовки) всех карт

07.05.2015, 23:56. Показов 3745. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Метод перезаписывает случайные ячейки из первого в новый массив. А затем копирует его в старый.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public void Shuffle()
        {
            Random r = new Random();
            string []NewCardDeck = new string[length];
            for (int i = 0; i < length; ++i)
            {
                string sCard = MasCardDeck[r.Next(0, length - 1)];
                while (NewCardDeck.Contains(sCard))
                {
                    sCard = MasCardDeck[r.Next(0, length - 1)];
                }
                NewCardDeck[i] = sCard;
            }
            NewCardDeck.CopyTo(MasCardDeck, 0);
        }

Последний номер постоянно null. В чем ошибка?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2015, 23:56
Ответы с готовыми решениями:

Программа перетасовки карт
не работает прогорамма( #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;time.h&gt; using namespace std; ...

Метод перемешивания. Уходит в минус
Всем добрый день. Битый час пытаюсь понять почему счетчик подсчета перемещений (count) уходит в минус. Подскажите пожалуйста, в чем...

Колода карт из 36 карт, сколькими способами можно достать 5 карт?
Колода карт из 36 карт. Сколькими способами можно достать 5 карт так, чтобы среди них были пиковые карты?

14
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
08.05.2015, 00:25
Zibyo,
C#
1
2
            var rnd = new Random();
            cards = cards.OrderBy(c => rnd.NextDouble()).ToArray();
2
 Аватар для memphis
740 / 284 / 83
Регистрация: 12.12.2012
Сообщений: 564
08.05.2015, 13:52
Лучший ответ Сообщение было отмечено Zibyo как решение

Решение

Цитата Сообщение от Zibyo Посмотреть сообщение
В чем ошибка?
Ошибка в том, что седьмой строке у метода Next() вторым параметром является Исключенный верхний предел возвращаемого случайного числа.
И, да. Человеческое перемешивание
2
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
08.05.2015, 14:55
C#
1
2
int seed = (int)DateTime.Now.Ticks;
Random rnd = new Random(seed)
3
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.05.2015, 16:09
Storm23, потенциально этот метод никогда не отсортирует даже массив из трех элементов... Не считая того, что CompareTo всегда должен возвращать одно и то же число при одних аргументах.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
08.05.2015, 21:47
Цитата Сообщение от Psilon Посмотреть сообщение
Storm23, потенциально этот метод никогда не отсортирует даже массив из трех элементов...
Не знаю о чем вы, этот метод прекрасно работает.
0
4 / 4 / 3
Регистрация: 21.06.2013
Сообщений: 23
09.05.2015, 14:55  [ТС]
Спасибо за ответы, забыл указать, что без использования LInQ. Пока только изучаю С#, поэтому LInQ пока не знаю, но штука очень интересная
0
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
09.05.2015, 16:29
Цитата Сообщение от Psilon Посмотреть сообщение
потенциально этот метод никогда не отсортирует даже массив из трех элементов...
тоже интересно услышать обоснование этих слов
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.05.2015, 16:37
rattrapper, ну если не смотреть вероятность такого события, то пусть при каждой проверке каждая пара элементов будет давать 1 ( или -1), то есть больше или меньше. Например
a0.CompareTo(a1) == 1, a1.CompareTo(a2) == 1, a2.CompareTo(a0) == 1, тогда он будет их вечно сравнивать. то есть a0 > a1 > a2 > a0
1
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
09.05.2015, 17:31
Цитата Сообщение от Zibyo Посмотреть сообщение
Спасибо за ответы, забыл указать, что без использования LInQ.
Так принцип тот же: можно использовать встроенные методы сортировки, только использовать при этом генератор случайных чисел.
C#
1
2
3
4
5
6
7
8
         static void Main(string[] args)
        {
            var l = new List<int>() {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
            var rnd = new Random();
            l.Sort((x,y) => rnd.Next(-1,1));
            Console.WriteLine(string.Join(", ",l));
            Console.ReadKey();
        }
1
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
09.05.2015, 18:06
Psilon, сразу предупреждаю, что тестировщик из меня так себе. Но, думаю, что данный код на практике показывает, что встроенные методы сортировки все-таки обходят проблему.
Тесты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Stopwatch sw = new Stopwatch();
Random rnd = new Random();
for(int i = 0; i < 100; i++)
{
    int[] seq = Enumerable.Range(rnd.Next(100), 3).ToArray();
    TimeSpan time1, time2;
    sw.Restart();
    int[] arr1 = seq.OrderBy(n => n).ToArray();
    time1 = sw.Elapsed;
    sw.Restart();
    int[] arr2 = seq.OrderBy(n => 
        rnd.Next(2) * 2 - 1 /* -1 или 1 */).ToArray();
    time2 = sw.Elapsed;
    Console.WriteLine("{0}\t{1}", time1.Ticks, time2.Ticks);
}
Console.ReadKey();
ВЫВОД КОНСОЛИ:
Code
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
64409   1827
87      25
112     20
35      20
30      25
35      20
35      25
30      20
35      25
35      25
25      20
30      20
30      71
35      25
112     25
30      20
35      46
35      25
35      25
35      25
30      20
35      25
46      25
215     20
35      20
46      25
56      25
82      25
71      25
41      518
66      25
66      25
523     20
61      25
508     25
585     25
189     25
195     25
205     30
66      25
195     20
56      30
56      25
46      20
215     30
61      25
61      25
297     25
195     25
482     25
487     20
189     25
56      20
184     20
61      25
35      184
61      25
66      25
61      25
595     25
189     25
200     25
61      25
51      25
189     25
61      25
61      25
61      25
118     25
61      25
61      25
143     25
66      25
487     25
482     46
66      25
97      25
544     25
41      184
66      25
66      20
71      20
46      25
564     25
497     30
56      25
195     30
549     30
513     25
189     25
502     25
502     30
66      25
41      25
477     25
133     25
61      25
184     25
51      174
56      25


Добавлено через 2 минуты
вероятность неопределенной ситуации в данном случае - 1/3

Добавлено через 5 минут
з.ы. результаты для сортировки обычным способом я выводил для сравнения стабильности показателей
0
Заблокирован
09.05.2015, 18:08
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
public static class IEnumerableExtensions
{
    private static Random rnd = new Random();
 
    public static IEnumerable<T> Shuffle<T>(this T[] sequence)
    {
        return sequence.OrderBy(item => rnd.Next());
    }
 
    public static IEnumerable<T> Shuffle<T>(this T[] sequence, Func<int> random)
    {
        return sequence.OrderBy(item => random());
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        var rnd = new Random();
        var arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        var shuffled1 = arr.Shuffle().ToArray();
        var shuffled2 = arr.Shuffle(rnd.Next).ToArray();
    }
}
1
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
09.05.2015, 18:15
Цитата Сообщение от Psilon Посмотреть сообщение
то есть a0 > a1 > a2 > a0
Если сравнение первых двух пар уже было произведено, то зачем сравнивать а2 и а0? Это уже проблема алгоритма сортировки и я не думаю, что встроенные методы страдают такой ерундой.Ну, а так зачем уповать на вероятность, когда можно сделать так, что функция будет выдавать единицу всегда
C#
1
2
3
4
5
6
7
8
9
       static void Main(string[] args)
        {
            var l = new List<int>() {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
            var rnd = new Random();
            l.Sort((x,y) => 1);
            Console.WriteLine(string.Join(", ",l));
            Console.ReadKey();
 
        }
Никакого зацикливания не происходит, хотя последовательность выдается одна и та же. Что в принципе ожидаемо.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
09.05.2015, 18:37
Цитата Сообщение от Psilon Посмотреть сообщение
rattrapper, ну если не смотреть вероятность такого события, то пусть при каждой проверке каждая пара элементов будет давать 1 ( или -1), то есть больше или меньше. Например
a0.CompareTo(a1) == 1, a1.CompareTo(a2) == 1, a2.CompareTo(a0) == 1, тогда он будет их вечно сравнивать. то есть a0 > a1 > a2 > a0
Psilon, Метод OrderBy буферизирует ключи сортировки, поэтому ситуация, которую вы описываете не может возникнуть. В буферизации легко убедиться следующим примером:
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
32
33
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            //создаем 100 объетов
            var arr = new List<Foo>();
            for (int i = 0; i < 100; i++)
                arr.Add(new Foo());
 
            //соритруем
            var list = arr.OrderBy(f => f.Key).ToList();
 
            //выводим число обращений к свойству  Key
            Console.WriteLine(Foo.Counter);//выводит 100, это значит, что метод OrderBy обращается лишь однажды к свойству и кеширует его
        }
    }
 
    public class Foo
    {
        public static int Counter = 0;
        private static Random rnd = new Random();
 
        public int Key
        {
            get
            {
                Counter++;
                return rnd.Next();
            }
        }
    }
Поэтому предложенная мною сортировка - прекрасно работает. Единственный ее минус - в том, что это перемешивание работает за O(n log n), в то время, как классический алгоритм перемешивания работает за O(n).
Еще один маленький недостаток в том, что число возможных перемешиваний этот метод дает меньше теоретического, из-за возможных одинаковых ключей сортировки. Однако на практике этот недостаток не существенен.
2
Заблокирован
09.05.2015, 18:51
или даже вот так, чтоб совсем красиво было
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
public static class IEnumerableExtensions
{
    private static Random rnd = new Random();
 
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> sequence)
    {
        return sequence.OrderBy(item => rnd.Next());
    }
 
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> sequence, Func<int> random)
    {
        return sequence.OrderBy(item => random());
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        var rnd = new Random();
        var arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        var shuffled1 = arr.Shuffle().ToArray();
        var shuffled2 = arr.Shuffle(rnd.Next).ToArray();
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.05.2015, 18:51
Помогаю со студенческими работами здесь

Из колоды карт (36 карт) наудачу берут пять карт
Здравствуйте! С теорией вероятностей всегда имел проблему, не могу никак сообразить. Задание такое: Из колоды карт (36 карт) наудачу...

Минимизация булевой функции. Метод минимизирующих карт
Доброго времени суток, уважаемые соучастники. Попалось мне по мат.логике следующее задание: Найти МДНФ с помощью минимизирующих карт ...

Эффективный алгоритм перетасовки элементов массива
Друзья, написал вот такую функцию public static void arrayShuffle(int arr) { int length = arr.length; ...

Компьютер работает только после перетасовки памяти
Стал плохо включаться компьютер: Включается, но ничего не выводит, на спикер идет такой звук https://yadi.sk/d/COm8Cdt13LSkRF . Потом,...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru