Nano Hash - криптовалюты, майнинг, программирование

Нет повторения результата после перемешивания массива

По сути, у меня есть массив, который перемешивается. Массив представляет собой колоду карт как таковую:

var rank = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
var suit = ["♠", "♥","♦","♣"]
var deck = [String]()

У меня есть цикл for для создания колоды с

    for t in suit {
        for r in rank {
            deck.append("\(r)\(t)")
        }
    }

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

        deck.shuffle()

Единственное, пока результаты случайны, я не хочу, чтобы карты повторялись. Например, если результатом является 2♠, я бы не хотел, чтобы 2♥, 2♦, 2♣ следовали в печатном списке.

Любая помощь приветствуется! Спасибо!


  • Думали ли вы просто перетасовать эти 52 снова, пока не будет повторений? Существует 52! = 8.065 x 10^67 способов перетасовать колоду, поэтому вероятность того, что вам нужно будет перетасовать колоду, довольно мала. 07.02.2017
  • Да, хотя происходит то, что UILabel печатает то, что такое Deck.First, а затем перемешивает. Моя единственная проблема заключается в том, что я никогда не хочу, чтобы порядок, напечатанный после перетасовки, повторялся. 07.02.2017
  • Вы действительно не хотите перетасовать колоду? 07.02.2017
  • Значит, вы никогда не хотите, чтобы за картой следовала другая карта того же ранга? 07.02.2017
  • Да, в принципе, я хочу перетасовать, но чтобы результаты не были одного ранга. Спасибо за ответ! 07.02.2017
  • Ознакомьтесь с этим ответом -the-sam/39172247#39172247" title="есть ли способ перетасовать массив так, чтобы никакие два последовательных значения не были одинаковыми"> stackoverflow.com/questions/39170398/ 07.02.2017

Ответы:


1

Я думаю, что лучший способ продолжить — использовать модифицированную тасовку Кнута. Код ниже является полным примером. Просто запустите его в оболочке с помощью swiftc -o customshuffle customshuffle.swift && ./customshuffle после сохранения содержимого в customshuffle.swift.

import Foundation

let decksize = 52


let rankStrings = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
let suitStrings = ["♠", "♥","♦","♣"]

struct card : Hashable, Equatable, CustomStringConvertible {
    var rank: Int //1,2...,11,12,13
    var suit: Int // 1,2,3,4

    var hashValue: Int {
      return rank + suit
    }
    static func == (lhs: card, rhs: card) -> Bool {
        return lhs.rank == rhs.rank && lhs.suit == rhs.suit
    }

    var description: String {
      return rankStrings[self.rank - 1] + suitStrings[self.suit - 1]
    }
}

// seems like Swift still lacks a portable random number generator
func portablerand(_ max: Int)->Int {
      #if os(Linux)
            return Int(random() % (max + 1)) // biased but I am in a hurry
       #else
            return Int(arc4random_uniform(UInt32(max)))
      #endif
}

// we populate a data structure where the
// cards are partitioned by rank and then suit (this is not essential)

var deck = [[card]]()
for i in 1...13 {
    var thisset = [card]()
    for j in 1...4 {
        thisset.append(card(rank:i,suit:j))
    }
    deck.append(thisset)
}

// we write answer in "answer"
var answer = [card]()
// we pick a card at random, first card is special
var rnd = portablerand(decksize)
answer.append(deck[rnd / 4].remove(at: rnd % 4))

while answer.count < decksize {
  // no matter what, we do not want to repeat this rank
  let lastrank = answer.last!.rank
  var myindices = [Int](deck.indices)
  myindices.remove(at: lastrank - 1)
  var totalchoice = 0
  var maxbag = -1
  for i in myindices {
      totalchoice = totalchoice + deck[i].count
      if  maxbag == -1 || deck[i].count  > deck[maxbag].count {
        maxbag = i
      }
  }
  if 2 * deck[maxbag].count >= totalchoice {
    // we have to pick from maxbag
    rnd = portablerand(deck[maxbag].count)
    answer.append(deck[maxbag].remove(at: rnd))
  } else {
    // any bag will do
    rnd = portablerand(totalchoice)
    for i in myindices {
        if rnd >= deck[i].count {
          rnd = rnd - deck[i].count
        } else {
          answer.append(deck[i].remove(at: rnd))
          break
        }
    }
  }
}


for card in answer {
  print(card)
}

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

07.02.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..