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

Создание случайного цвета для метки, которая не появляется дважды

Я работаю над своим первым проектом, в котором я пытаюсь создать случайный цвет для UILabel (при нажатии кнопки), который не повторяется дважды подряд. Я прочитал много вопросов и нашел коды, которые генерируют случайные числа, которые не появляются дважды подряд, однако, когда я «связываю» это случайное число с UIColor и «связываю» этот UIColor с меткой, код больше не работает. В этом коде нет ошибок, но он позволяет одному и тому же цвету появляться дважды;

@IBOutlet var HelloWorld: UILabel!
@IBOutlet var MyButton: UIButton!

@IBAction func MyButton(sender: AnyObject) {
let randomNumber2 = Int(arc4random_uniform(5))

    if randomNumber2 == 0 {
        HelloWorld.textColor = UIColor.redColor()
    }
    else if randomNumber2 == 1 {
        HelloWorld.textColor = UIColor.blueColor()
    }
    else if randomNumber2 == 2 {
        HelloWorld.textColor = UIColor.yellowColor()
    }
    else if randomNumber2 == 3 {
        HelloWorld.textColor = UIColor.orangeColor()
    }
    else if randomNumber2 == 4 {
        HelloWorld.textColor = UIColor.blueColor()
    }

Кто-нибудь знает, как сгенерировать случайный цвет для метки, которая не появляется дважды подряд?

02.01.2016

  • Посмотрите здесь. Это очень похоже, создайте массив цветов и выберите из этого массива без дубликатов. 02.01.2016
  • Вы должны использовать случай переключения вместо всех тех условий if 02.01.2016
  • var randomNumber = Int (arc4random_uniform (5)) 02.01.2016
  • Вам нужно будет сделать то же самое внутри цикла while. Btw выбрал другое имя для вашего var, отличное от того же имени метода 02.01.2016
  • измените тип возврата метода на UIColor: func getRandomColor() -> UIColor {... 02.01.2016
  • @ luk2302 luk2302 Я изменил тип возвращаемого значения метода на UIColor:... Но теперь я получаю сообщение об ошибке: метки действительны только для циклов, операторов if и switch. В моем коде много нового, поэтому я немного запутался, извините.. 02.01.2016
  • @RS добавьте этот код к своему вопросу в качестве обновления. Вы видели мой ответ? 02.01.2016
  • удалить UIColor : Ваша версия функции полностью зашифрована. Она не будет работать 02.01.2016

Ответы:


1

Вы можете использовать этот Singleton класс

class ColorGenerator {
    static let sharedInstance = ColorGenerator()
    private var last: UIColor
    private var colors: [UIColor] = [.redColor(), .blueColor(), .yellowColor(), .orangeColor(), .greenColor()]

    private init() {
        let random = Int(arc4random_uniform(UInt32(colors.count)))
        self.last = colors[random]
        colors.removeAtIndex(random)
    }

    func next() -> UIColor {
        let random = Int(arc4random_uniform(UInt32(colors.count)))
        swap(&colors[random], &last)
        return last
    }
}

Использование довольно простое

Шаг 1

Создайте новый файл в своем проекте ColorGenerator.swift и вставьте в него приведенный выше код.

Шаг 2

В любом месте вашего кода просто напишите

ColorGenerator.sharedInstance.next()

чтобы получить новый случайный UIColor.

введите здесь описание изображения

Вот и все.

02.01.2016
  • Замечательно, работает отлично! - Вы забыли однако написать, что вам нужно импортировать UIKit, чтобы код работал. В остальном отличная работа. 05.01.2016

  • 2

    Если вы не можете ограничить результат случайной функции, сохраните результат и проверьте уникальность случайного числа, проверив, что массив сгенерированных случайных чисел не содержит нового случайного числа.

    struct UniqueRandomGenerator<T:Equatable> {
    
        var usedRandoms : [T] = []
    
        mutating func newRandom(randomGenerator:() -> T) -> T {
    
            var random = randomGenerator()
            while usedRandoms.contains(random) {
                random = randomGenerator()
            }
            usedRandoms.append(random)
            return random
        }
    }
    

    func randomGenerator() -> Float {
        return Float(arc4random())
    }
    
    var uniqueRandomGen = UniqueRandomGenerator<Float>() // not so elegant
    uniqueRandomGen.newRandom(randomGenerator)
    

    Если вы можете ограничить результат (известные возможные значения), вы можете использовать функцию ниже.

    struct RandomSet<T:Equatable> {
    
        var set : [T] = []
        var unusedSet : [T] = []
    
        init(set:[T]) {
            self.set = set
            self.unusedSet = set
        }
    
        mutating func uniqueRandom() -> T {
            if (unusedSet.count == 0) {
                unusedSet = set
            }
            let randomNumber = Int(arc4random_uniform(UInt32(unusedSet.count)))
            return unusedSet.removeAtIndex(randomNumber)
        }
    }
    

    var randomColors = RandomSet(set: [UIColor.redColor(),UIColor.blueColor(),UIColor.yellowColor(),UIColor.orangeColor(),UIColor.greenColor()])
    randomColors.uniqueRandom() // a random color
    
    02.01.2016
  • Как я могу это использовать? структуру UniqueRandomSet‹T:Equatable› невозможно использовать в ViewController, любом действии кнопки или таймере. 02.01.2016
  • @R.S просто поместил определение struct в отдельный файл. Используйте экземпляр структуры в своем представлении. 02.01.2016
  • @R.S сначала попробуйте на детской площадке и посмотрите, что он делает. 02.01.2016
  • Новые материалы

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

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

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

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

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

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

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