Перестановка карты в C#

Существуют некоторые причуды для знания здесь.

  1. HTMLIFrameElement.contentWindow, вероятно, более легкий путь, но это - не совсем стандартное свойство, и некоторые браузеры не поддерживают его, главным образом более старые. Это вызвано тем, что стандарт HTML Уровня 1 DOM не имеет ничего для высказывания об эти window объект.

  2. можно также попробовать HTMLIFrameElement.contentDocument.defaultView, который позволяют несколько более старых браузеров, но IE не делает. Несмотря на это, в стандарте явно не говорится, что Вы возвращаетесь эти window объект по той же причине как (1), но можно взять несколько дополнительных версий браузера здесь, если Вы заботитесь.

  3. window.frames['name'] возврат окна является самым старым и следовательно самый надежный интерфейс. Но тогда необходимо использовать name="..." атрибут, чтобы быть в состоянии получить кадр по имени, который является немного ужасен / <забастовка>, удержанная от использования / переходный. (id="..." было бы лучше, но IE не нравится это.)

  4. window.frames[number] также очень надежно, но знание правильного индекса является приемом. Можно сойти с рук это, например, если Вы знаете, что у Вас только есть один iframe на странице.

  5. совершенно возможно, что дочерний iframe еще не загрузился, или что-то еще пошло не так, как надо для создания его недоступным. Можно найти легче инвертировать поток связи: то есть, имейте дочерний iframe, уведомляют window.parent сценарий, когда это закончилось загруженный и готово быть призванным обратно. Путем передачи одного из его собственных объектов (например, функция обратного вызова) к родительскому сценарию, тот родитель может тогда связаться непосредственно со сценарием в iframe, не имея необходимость волноваться о том, с чем HTMLIFrameElement это связано.

13
задан Jacob 26 September 2012 в 02:04
поделиться

4 ответа

Use Fisher-Yates shuffle.

Your C# code should look something like this:

static public class FisherYates
{
    static Random r = new Random();
    //  Based on Java code from wikipedia:
    //  http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
    static public void Shuffle(int[] deck)
    {
        for (int n = deck.Length - 1; n > 0; --n)
        {
            int k = r.Next(n+1);
            int temp = deck[n];
            deck[n] = deck[k];
            deck[k] = temp;
        }
    }
}
48
ответ дан 1 December 2019 в 17:15
поделиться

Shuffling a deck of cards is something that seems trivial at first, but usually the algorithm that most people come up with is incorrect.

Jeff Atwood (Coding Horror) wrote a few very good articles on the subject:

http://www.codinghorror.com/blog/archives/001008.html

http://www.codinghorror.com/blog/archives/001015.html

(especially the second one is a must-read)

17
ответ дан 1 December 2019 в 17:15
поделиться

Я думаю, что это тот случай, когда вы, возможно, слишком увлеклись абстракцией.

Перетасовка колоды карт в программном обеспечении - это вопрос обеспечения колода пользователю в случайном порядке. На самом деле это не требует от вас тасовать их заранее.

Запустите вашу колоду. (Обычно я использую число от 1 до 52 для представления карты и математически вычисляю, какая карта.)

  1. Раздайте карту, используя генератор случайных чисел, чтобы выбрать карту из Колоды имеющихся карт.
  2. Поменять местами. эта карта с картой в конце колоды.
  3. Уменьшите значение счетчика, указывающего на конец колоды, чтобы удалить эту карту из колоды.
  4. Переходите к шагу 1, пока не закончите вытягивание карт.

Правка : И вообще, если у вас есть хороший генератор случайных чисел, ничего не получится от "перемешивания" его несколько раз.

Это должно быть так. возможно с использованием показанных вами структур данных. Вам просто нужно добавить метод «Draw» и переменную-член, чтобы отслеживать конец колоды. Если вы без ума от того, чтобы на самом деле выполнить «тасование» заранее, то A ваш профессор придурок, B каждый раз, когда вы берете 52 карты, колода будет перетасована. После того, как вы вытащили все карты, вам необходимо предоставить метод «DeckEmpty» и метод для сброса конца колоды, чтобы снова включить все карты.

это должно быть несколько раз.

Это должно быть возможно, используя структуры данных, которые вы показали. Вам просто нужно добавить метод «Draw» и переменную-член, чтобы отслеживать конец колоды. Если вы без ума от того, чтобы на самом деле выполнить «тасование» заранее, то A ваш профессор придурок, B каждый раз, когда вы берете 52 карты, колода будет перетасована. После того, как вы вытащили все карты, вам необходимо предоставить метод «DeckEmpty» и метод для сброса конца колоды, чтобы снова включить все карты.

это должно быть несколько раз.

Это должно быть возможно, используя структуры данных, которые вы показали. Вам просто нужно добавить метод «Draw» и переменную-член, чтобы отслеживать конец колоды. Если вы без ума от того, чтобы на самом деле выполнить «тасование» заранее, то A ваш профессор придурок, B каждый раз, когда вы берете 52 карты, колода будет перетасована. После того, как вы вытащили все карты, вам необходимо предоставить метод «DeckEmpty» и метод сброса конца колоды, чтобы снова включить все карты.

B каждый раз, когда вы берете 52 карты, колода перетасовывается. После того, как вы вытащили все карты, вам необходимо предоставить метод «DeckEmpty» и метод сброса конца колоды, чтобы снова включить все карты.

B каждый раз, когда вы берете 52 карты, колода перетасовывается. После того, как вы вытащили все карты, вам необходимо предоставить метод «DeckEmpty» и метод сброса конца колоды, чтобы снова включить все карты.

5
ответ дан 1 December 2019 в 17:15
поделиться

Перемешивание должно работать следующим образом:

Вы берете две случайные карты из колоды (индекс карты в колоде - это случайные числа) И поменяйте местами две карты. Например, возьмите карту с индексом 2 и карту с индексом 9 и попросите их поменять местами.

И это можно повторить определенное количество раз.

Алгоритм должен выглядеть примерно так:

int firstNum = rnd.Next(52);
int secondNum = rnd.Next(52);

Card tempCard = MyCards[firstNum];
MyCards[firstNum] = MyCards[secondNum];
MyCards[secondNum] = tempCard;
-1
ответ дан 1 December 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: