4 / 4 / 3
Регистрация: 21.06.2013
Сообщений: 23
1

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

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

Author24 — интернет-сервис помощи студентам
Метод перезаписывает случайные ячейки из первого в новый массив. А затем копирует его в старый.
Кликните здесь для просмотра всего текста
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2015, 23:56
Ответы с готовыми решениями:

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

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

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

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

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

Решение

Цитата Сообщение от Zibyo Посмотреть сообщение
В чем ошибка?
Ошибка в том, что седьмой строке у метода Next() вторым параметром является Исключенный верхний предел возвращаемого случайного числа.
И, да. Человеческое перемешивание
2
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
08.05.2015, 14:55 4
C#
1
2
int seed = (int)DateTime.Now.Ticks;
Random rnd = new Random(seed)
3
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.05.2015, 16:09 5
Storm23, потенциально этот метод никогда не отсортирует даже массив из трех элементов... Не считая того, что CompareTo всегда должен возвращать одно и то же число при одних аргументах.
0
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
08.05.2015, 21:47 6
Цитата Сообщение от Psilon Посмотреть сообщение
Storm23, потенциально этот метод никогда не отсортирует даже массив из трех элементов...
Не знаю о чем вы, этот метод прекрасно работает.
0
4 / 4 / 3
Регистрация: 21.06.2013
Сообщений: 23
09.05.2015, 14:55  [ТС] 7
Спасибо за ответы, забыл указать, что без использования LInQ. Пока только изучаю С#, поэтому LInQ пока не знаю, но штука очень интересная
0
foo();
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
09.05.2015, 16:29 8
Цитата Сообщение от Psilon Посмотреть сообщение
потенциально этот метод никогда не отсортирует даже массив из трех элементов...
тоже интересно услышать обоснование этих слов
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.05.2015, 16:37 9
rattrapper, ну если не смотреть вероятность такого события, то пусть при каждой проверке каждая пара элементов будет давать 1 ( или -1), то есть больше или меньше. Например
a0.CompareTo(a1) == 1, a1.CompareTo(a2) == 1, a2.CompareTo(a0) == 1, тогда он будет их вечно сравнивать. то есть a0 > a1 > a2 > a0
1
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
09.05.2015, 17:31 10
Цитата Сообщение от 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();
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
09.05.2015, 18:06 11
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();
ВЫВОД КОНСОЛИ:
Код
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 12
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
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
09.05.2015, 18:15 13
Цитата Сообщение от 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
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
09.05.2015, 18:37 14
Цитата Сообщение от 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 15
или даже вот так, чтоб совсем красиво было
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
09.05.2015, 18:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2015, 18:51
Помогаю со студенческими работами здесь

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

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

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

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

Каково число всех возможных комбинаций трёх карт?
В колоде 36 карт на удачу вытянули 3 карты. Каково число всех возможных комбинаций? Сколько таких...

Минимизировать функцию, используя метод Квайна-Мак-Класки и карт Карно
Дана логическая функция. Минимизировать функцию, используя метод Квайна-Мак-Класки. F(0, 2, 6,...


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

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

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