Перемешать массив или рандомизировать индекс при выборе? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть стопка покерных карт (List<Card>), где я хочу выбирать карты случайным образом, когда игроки щелкают по стеку.

Чтобы создать «случайную карту», ​​я думаю о двух способах:

  • перетасовать позиции карт, переупорядочив Список во время инициализации, затем просто выбрав первую карту со статическим индексом [0].
  • сохраните стопку как есть и используйте cards[Random.Range(0,cards.Count)] для выбора карты

(При выборе карты в обоих случаях она также удаляется из списка.)

Существуют ли какие-либо существенные различия (статистически или иначе), недостатки / преимущества и т. Д. Между этими двумя подходами или они по существу одинаковы?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

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

        private void BtnRandomIndex_Click(object sender, EventArgs e)
    {
        int[] Arr = new int[5];

        for (int i = 0; i <= 4; i++)
            Arr[i] = i * 10 ;

        Random Rnd=new Random();
        MessageBox.Show(Rnd.Next((Arr.Length)).ToString());
    }

Надеюсь, это поможет ^ _ ^

0 голосов
/ 13 апреля 2019

Здесь есть два метода: Случайный выбор и Перестановка.

Случайный выбор включает в себя получение упорядоченной колоды, сбор случайной карты и вытягивание этой карты из колоды.

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

В обоих случаях вам нужно будет сделать не более N-1 вызовов случайных чисел, где N - количество карт в колоде (когда есть только одна карта, вам не нужно звонить в ГСЧ) ). Однако в случае случайного выбора вам не нужно делать эти случайные вызовы одновременно, и не только, вам даже не нужно вызывать функцию случайного N-1 раз. Если вы в итоге наберете только 10 лучших карт, это всего лишь 10 случайных звонков. Кроме того, если вам когда-либо понадобится перестановить колоду, вы можете просто добавить карты обратно в колоду и затем вернуться к случайному выбору.

С точки зрения алгоритмической эффективности, Random Pick является очевидным превосходным выбором.

Перетасуйте колоду в любом случае.

Вот в чем дело: вы не пытаетесь выбрать случайный предмет из последовательности, вы пытаетесь перетасовать колоду карт. Работайте с абстракцией, соответствующей вашему дизайну, и отклоняйтесь от нее только тогда, когда это необходимо. Черт, я бы почти порекомендовал использовать Stack вместо List просто потому, что он лучше всего соответствует базовой структуре колоды карт. Но список может послужить вам лучше, если вы планируете много манипулировать колодой.

Кроме того, учтите следующее: Random Pick предполагает, что вся ваша колода перемешана. Вы не всегда можете хотеть всю свою колоду перетасовать. Вы можете явно разместить карты сверху, снизу или посередине колоды. Это будет намного сложнее, если вы попытаетесь научиться работать с алгоритмами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...