Giovanie Rodz
Giovanie Rodz

Reputation: 1801

How to make a random color with Swift

How I can make a random color function using Swift?

import UIKit

class ViewController: UIViewController {

    var randomNumber = arc4random_uniform(20)
    var randomColor = arc4random()

    //Color Background randomly
    func colorBackground() {

        // TODO: set a random color
        view.backgroundColor = UIColor.yellow

    }
}

Upvotes: 114

Views: 80922

Answers (13)

Mojtaba Hosseini
Mojtaba Hosseini

Reputation: 119917

✅ Stable Random Color

It's easy to generate random colors when you know colors are made from numbers. So just pass in random values from 0.0 to 1.0. But many times you actually wanted to keep the random color without actually storing it.

Here is how you can generate random colors based on a seed (like for example the userID) which always be the same:

/// - Note: Make it `Color` for SwiftUI
extension UIColor {
    static func random(seed: Int) -> Self {
        var generator = RandomNumberGenerator(seed: seed)

        return .init(
            red: .random(in: (0...1), using: &generator),
            green: .random(in: (0...1), using: &generator),
            blue: .random(in: (0...1), using: &generator)
            , alpha: 1 // Remove this line for the `SwiftUI.Color`
        )
    }
}

And here is the random number generator behind this:

struct RandomNumberGenerator: Swift.RandomNumberGenerator {
    init(seed: Int) { srand48(seed) }
    func next() -> UInt64 { UInt64(drand48() * Double(UInt64.max)) }
}
SwiftUI Example:

The following will always be the same and doesn't change on each run (nor each preview).

SwiftUI sample Note that you can use the random generator in a way that matches your needs

Upvotes: -1

Hassan Taleb
Hassan Taleb

Reputation: 2536

Swift 5.8.1 Extension

extension UIColor {
    static var random: UIColor {
        return .init(red: .random(in: 0...1), green: .random(in: 0...1), blue: .random(in: 0...1), alpha: 1)
    }
}

Usage

let randomColor = UIColor.random
print(randomColor)

Upvotes: 1

Orkhan Alikhanov
Orkhan Alikhanov

Reputation: 10060

For Swift 4.2

extension UIColor {
    static var random: UIColor {
        return UIColor(
            red: .random(in: 0...1),
            green: .random(in: 0...1),
            blue: .random(in: 0...1),
            alpha: 1.0
        )
    }
}

For Swift 3 and above:

extension CGFloat {
    static var random: CGFloat {
        return CGFloat(arc4random()) / CGFloat(UInt32.max)
    }
}

extension UIColor {
    static var random: UIColor {
        return UIColor(red: .random, green: .random, blue: .random, alpha: 1.0)
    }
}

Usage:

let myColor: UIColor = .random

Upvotes: 131

ABakerSmith
ABakerSmith

Reputation: 22959

You're going to need a function to produce random CGFloats in the range 0 to 1:

extension CGFloat {
    static func random() -> CGFloat {
        return CGFloat(arc4random()) / CGFloat(UInt32.max)
    }
}

Then you can use this to create a random colour:

extension UIColor {
    static func random() -> UIColor {
        return UIColor(
           red:   .random(),
           green: .random(),
           blue:  .random(),
           alpha: 1.0
        )
    }
}

If you wanted a random alpha, just create another random number for that too.

You can now assign your view's background colour like so:

self.view.backgroundColor = .random()

Upvotes: 226

Xeaza
Xeaza

Reputation: 1480

SwiftUI - Swift 5

import SwiftUI

extension Color {
    static var random: Color {
        return Color(red: .random(in: 0...1),
                     green: .random(in: 0...1),
                     blue: .random(in: 0...1))
    }
}

Usage:

let randomColor: Color = .random

Upvotes: 28

bungdito
bungdito

Reputation: 3620

func anotherGetRandomColor()->UIColor{

    let newRed   = Double(arc4random_uniform(256))/255.0
    let newGreen = Double(arc4random_uniform(256))/255.0
    let newBlue  = Double(arc4random_uniform(256))/255.0

    return UIColor(red: CGFloat(newRed), green: CGFloat(newGreen), blue: CGFloat(newBlue), alpha: 1.0)
}

Upvotes: 0

Raksha.
Raksha.

Reputation: 519

Swift 5.1

Make This function and generate Random color.

e.g. view.backgroundColor = random()

func random() -> UIColor {
        return UIColor(red: .random(in: 0...1),
                       green: .random(in: 0...1),
                       blue: .random(in: 0...1),
                       alpha: 1.0)
    }

Upvotes: 4

Leo Dabus
Leo Dabus

Reputation: 236498

For random solid colors you can use UIColor HSB initializer and randomize only the hue:

extension UIColor {
    static var random: UIColor {
        return .init(hue: .random(in: 0...1), saturation: 1, brightness: 1, alpha: 1)
    }
}

let color1: UIColor = .random
let color2: UIColor = .random
let color3: UIColor = .random
let color4: UIColor = .random
let color5: UIColor = .random

enter image description here

Upvotes: 37

Alex Chase
Alex Chase

Reputation: 1091

Using an extension with an inline function to generate randoms

extension UIColor {
    static func random() -> UIColor {

        func random() -> CGFloat { return .random(in:0...1) }

        return UIColor(red:   random(),
                       green: random(),
                       blue:  random(),
                       alpha: 1.0)
    }
}

Upvotes: 1

Sentry.co
Sentry.co

Reputation: 5609

Swift 4.2 🔸

I'm adding this answer because it uses a different approach, and because many of the previous answers requires additional syntactic sugar, which in my opinion shouldn't be preferred. Vanilla Swift for the win.

extension UIColor {
    /**
     * Returns random color
     * ## Examples: 
     * self.backgroundColor = UIColor.random
     */
    static var random: UIColor {
        let r:CGFloat  = .random(in: 0...1)
        let g:CGFloat  = .random(in: 0...1)
        let b:CGFloat  = .random(in: 0...1)
        return UIColor(red: r, green: g, blue: b, alpha: 1)
    }
}

Upvotes: 12

TimBigDev
TimBigDev

Reputation: 529

Swift 4.2 Extension

extension UIColor {

    convenience init(red: Int, green: Int, blue: Int) {
        assert(red >= 0 && red <= 255, "Invalid red component")
        assert(green >= 0 && green <= 255, "Invalid green component")
        assert(blue >= 0 && blue <= 255, "Invalid blue component")

        self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0)
    }

    convenience init(rgb: Int) {
        self.init(
            red: (rgb >> 16) & 0xFF,
            green: (rgb >> 8) & 0xFF,
            blue: rgb & 0xFF
        )
    }

    static func random() -> UIColor {
        return UIColor(rgb: Int(CGFloat(arc4random()) / CGFloat(UINT32_MAX) * 0xFFFFFF))
    }

}

Usage:

let color = UIColor.random()

Upvotes: 5

Bhavin Ramani
Bhavin Ramani

Reputation: 3219

Make a function to generate random color:

func getRandomColor() -> UIColor {
     //Generate between 0 to 1
     let red:CGFloat = CGFloat(drand48())   
     let green:CGFloat = CGFloat(drand48()) 
     let blue:CGFloat = CGFloat(drand48())  

     return UIColor(red:red, green: green, blue: blue, alpha: 1.0)
}

Now, you can call this function whenever you need random color.

self.view.backgroundColor = getRandomColor()

Upvotes: 37

leogdion
leogdion

Reputation: 2350

With Swift 4.2, you can simplify this by using the new random functions which have been added:

extension UIColor {
  static func random () -> UIColor {
    return UIColor(
      red: CGFloat.random(in: 0...1),
      green: CGFloat.random(in: 0...1),
      blue: CGFloat.random(in: 0...1),
      alpha: 1.0)
  }
}

There are more details here.

Upvotes: 14

Related Questions